sql >> Database teknologi >  >> RDS >> Oracle

Hvad er alternativ til Find_in_set af mysql i Oracle

Ikke et eksakt alternativ til MySQL's FIND_IN_SET , men i dit eksempel (hvor du kun behøver at vide, OM en værdi er indeholdt i et kommasepareret sæt) Oracles REGEX_COUNT med regex '^([^,]+,)*din_værdi(,[^,]+)*$' vil passe.

Undersøg følgende SQL-forespørgsler (for Oracle)...

Eksempler med tal

Søg efter nummer 1 i sættet:[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;

Returnerer 1 korrekt

Søg efter nummer 1 i sættet:[111.222.333]. INSTR ville undlade at rapportere negativt i dette tilfælde.

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

Returnerer 0 korrekt

Eksempler med strenge

Søg efter 'John' i et sæt navne:

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;

Returnerer 1 korrekt

Men hvis du søger efter bogstavet 'a' , vil det korrekt returnere nul (INSTR ville mislykkes igen).

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;

Returnerer 0 korrekt

Jeg ved, at dette spørgsmål er blevet besvaret for længe siden, men det rangerer godt i søgeresultaterne og kan sandsynligvis hjælpe andre, der leder efter en almindelig, men mere korrekt løsning end Oracles INSTR funktion.

Booleske udtryk

Det er også muligt at bruge booleske udtryk, såsom ELLER eller OG .

Et eksempel med ELLER er følgende:

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;

Returnerer 1 korrekt, da den fandt "peter" (søg efter enten "helen" eller "peter" ).

For AND tilgangen er en smule anderledes (ændrer CASE-udtrykket i stedet for 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;

Ovenstående forespørgsel søger efter både "john" OG "peter" . AND operationen kan implementeres let ved at duplikere REGEXP_COUNT udtryk i CASE syntaks, dog til gengæld med en lille præstationsstraf.



  1. MySQL-forespørgsel med grænse og stor offset, der tager evigheder

  2. Match Regex i MySQL for gentagne ord med betingelse ekskluder parenteser

  3. PostgreSQL:VÆLG HVOR mindre end 15 minutter gammel

  4. Kæmper med en MySQL-database med telefonnumre