sql >> Database >  >> RDS >> Oracle

Wat is een alternatief voor Find_in_set van mysql in Oracle?

Geen exact alternatief voor MySQL's FIND_IN_SET , maar in jouw voorbeeld (waar je alleen hoeft te weten ALS een waarde is opgenomen in een door komma's gescheiden set) Oracle's REGEX_COUNT met de regex '^([^,]+,)*your_value(,[^,]+)*$' past.

Bestudeer de volgende SQL-query's (voor Oracle)...

Voorbeelden met getallen

Zoek naar nummer 1 in de set:[1,2,3,4,5,6,11,12,13]

SELECT
    CASE WHEN REGEXP_COUNT('1,2,3,4,5,6,11,12,13', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
        THEN 1 ELSE 0
    END AS cnt
FROM DUAL;

Retourneert 1 correct

Zoek naar nummer 1 in de reeks:[111.222.333]. INSTR zou in dit geval niet negatief rapporteren.

SELECT
    CASE WHEN REGEXP_COUNT('111,222,333', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
        THEN 1 ELSE 0
    END AS cnt
FROM DUAL;

Retourneert 0 correct

Voorbeelden met strings

Zoek naar 'John' in een reeks namen:

SELECT
    CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*John(,[^,]+)*$', 1, 'i') > 0
        THEN 1 ELSE 0
    END as cnt
FROM DUAL;

Retourneert 1 correct

Maar als u zoekt op de letter 'a' , zal het correct nul retourneren (INSTR zou opnieuw mislukken).

SELECT
    CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*a(,[^,]+)*$', 1, 'i') > 0
        THEN 1 ELSE 0
    END as cnt
FROM DUAL;

Retourneert 0 correct

Ik weet dat deze vraag lang geleden is beantwoord, maar hij scoort goed in de zoekresultaten en kan waarschijnlijk anderen helpen die op zoek zijn naar een duidelijke maar correctere oplossing dan INSTR van Oracle. functie.

Booleaanse expressies

Het is ook mogelijk om Booleaanse uitdrukkingen te gebruiken, zoals OR of AND .

Een voorbeeld met OR is het volgende:

SELECT
    CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*(helen|peter)(,[^,]+)*$', 1, 'i') > 0
        THEN 1 ELSE 0
    END as cnt
FROM DUAL;

Retourneert 1 correct, want het heeft "peter" gevonden (zoek naar "helen" of "peter" ).

Voor AND de aanpak is een beetje anders (wijzigt de CASE-uitdrukking in plaats van de regex ):

SELECT
    CASE WHEN
            REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*john(,[^,]+)*$', 1, 'i') > 0 AND
            REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*peter(,[^,]+)*$', 1, 'i') > 0
        THEN 1 ELSE 0
    END as cnt
FROM DUAL;

De bovenstaande zoekopdracht zoekt naar zowel "john" EN "peter" . De AND bewerking kan eenvoudig worden geïmplementeerd door de REGEXP_COUNT . te dupliceren uitdrukking in de CASE syntaxis, echter in ruil voor een kleine prestatievermindering.



  1. Is Mysql UUID_SHORT() vergelijkbaar met UUID()

  2. Oracle SQL - bestaat niet - tekenreeks bestaat niet in een zoeklijst

  3. Fix "ERROR 3942 (HY000):elke rij van een VALUES-clausule moet ten minste één kolom hebben" bij gebruik van de VALUES-instructie in MySQL

  4. Groeperen op LIKE van een kolomwaarde