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.