WebHU - Programozási kérdések és válaszok

Mintaillesztés az Oracle SQL-ben

Megpróbálok egyes mintákat egyeztetni, és bizonyos karakterek és hosszúságok alapján kizárni néhányat.

Szeretném visszaadni mind a 3 karaktert és a 4 karakteres értéket:

  • A 3 karakteres értékeknek bármilyen betűnek kell lennie a 3. helyen, azaz 11A
  • A 4 karakteres értékeknek 2 betűnek kell lennie a végén, azaz 11AB, de nem lehetnek EF betűk, azaz ki kell zárni az olyan értékeket, mint a 11EF.

Asztal:

+------+
| CODE |
+------+
|   11 |
|  11A |
|  11B |
| 11EF |
| 11AB |
+------+

VÁRHATÓ KIMENET:

+-----------------+
| EXPECTED OUTPUT |
+-----------------+
|             11A |
|             11B |
|            11AB |
+-----------------+

Kipróbáltam ezt, de mindent visszaad, függetlenül a fent említett feltételektől:

select REGEXP_SUBSTR('11EF','^[0-9]{1,2}[A-Z]{1,2}?')  from dual;

select REGEXP_SUBSTR('11','^[0-9]{1,2}[A-Z]{1,2}?')  from dual;

select REGEXP_SUBSTR('11A','^[0-9]{1,2}[A-Z]{1,2}?')  from dual;
09.01.2020

  • Kérjük, küldje el teljes kérdését. Biztos, hogy a REGEXP_SUBSTR értéket szeretné a REGEXP_INSTR helyett? 09.01.2020
  • Elküldve. Nem, ebben nem vagyok biztos. Nyitott javaslatra. 09.01.2020
  • Egyik lekérdezése sem tartalmaz WHERE záradékot, így természetesen minden sornak megfelelni fog... 09.01.2020
  • A minta több előfordulása is megjelenhet ugyanabban az oszlopértékben (és szeretné kivonni az összeset) – vagy csak azt szeretné tesztelni, hogy egy oszlopérték egyezik-e? (Azaz kérjük, mutasson meg néhány tesztadatot táblázatos formában és a várt eredményeket) 09.01.2020
  • Az "EF"-re gondolsz együtt? azaz az 'FE'-t is ki kell zárni? 09.01.2020
  • igen, csak EF együtt. Nem szabad FE-t beletenni 09.01.2020

Válaszok:


1

Ez működött nekem Oracle Live SQL-en:

create table temp( text varchar2(25));

INSERT INTO temp values ('11');
INSERT INTO temp values ('11A');
INSERT INTO temp values ('11B');
INSERT INTO temp values ('11EF');
INSERT INTO temp values ('11AB');
INSERT INTO temp values ('21ASDF');
INSERT INTO temp values ('31ASD');
INSERT INTO temp values ('251ASDF');
INSERT INTO temp values ('41ASDFDSF');

select text
from temp
where length(text) between 3 and 4
and (regexp_instr(text, '[[:alpha:]]', 3) > 0 or regexp_instr(text, '[[:alpha:]][[:alpha:]]', 3) > 0)
and substr(text, 3, 2) <> 'EF';

TEXT
11A
11B
11AB
09.01.2020
  • Optimalizálhatnád a regexp_instr-t, hogy az OR ne legyen kötelező, de gyorsan dolgoztam. Örülök, hogy segíthettem 09.01.2020

  • 2

    A normál kifejezésedet erre változtattam. Nem a reguláris kifejezésben végzi el a EF-ellenőrzést, hanem a lekérdezés más helyén, mivel ez sokkal bonyolultabbá tenné a regex-et:

    ^(\d\d[A-Z])|(\d\d[A-Z]{2})$
    

    És ez a lekérdezés működik nekem az SqlFiddle.com webhelyen:

    SELECT
      text_col
    FROM
      Foo
    WHERE
      REGEXP_INSTR( text_col, '^(\d\d[A-Z])|(\d\d[A-Z]{2})$' ) > 0
      AND
      REGEXP_INSTR( text_col, 'EF$' ) = 0
    
    
    09.01.2020
  • Köszönöm a hozzászólást. Frissítettem a kérdéseket a várt kimenettel. Ez számomra semmit nem ad vissza 09.01.2020
  • @django-unchained Megnézted az általam közzétett SqlFiddle linket? 09.01.2020

  • 3

    Ez a kis- és nagybetűket nem érző REGEXP_LIKE() függvényt használ, amely megfelel egy 2 karakterből álló karakterláncnak, amelyet egy betű követ, VAGY 2 karakter, amelyet bármely betű követ, kivéve az E, majd bármely betű, kivéve az F.

    with tbl(code) as (
      select '11' from dual union all
      select '11A' from dual union all
      select '11b' from dual union all
      select '11EF' from dual union all
      select '11FE' from dual union all
      select '11A#' from dual union all
      select '11BA' from dual union all
      select '1ZZZ' from dual union all  
      select NULL from dual union all
      select 'HELLO' from dual union all
      select 'A12' from dual
    )
    select code
    from tbl
    where regexp_like(code, '^((.{2}[A-Z])|(.{2}[A-D,F-Z][A-E,G-Z]))$', 'i');
    
    
    
    CODE 
    -----
    11A  
    11b  
    11FE 
    11BA 
    1ZZZ 
    
    5 rows selected.
    

    SZERKESZTÉS: kicsit le lehetne egyszerűsíteni, hogy:

    '^.{2}(([A-Z])|([A-D,F-Z][A-E,G-Z]))$'

    09.01.2020
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..