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.