Inte ett exakt alternativ till MySQL:s FIND_IN_SET
, men i ditt exempelfall (där du bara behöver veta OM ett värde finns i en kommaseparerad uppsättning) Oracles REGEX_COUNT
med regexet '^([^,]+,)*your_value(,[^,]+)*$'
kommer att passa.
Undersök följande SQL-frågor (för Oracle)...
Exempel med siffror
Sök efter nummer 1
i uppsättningen:[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;
Returnerar 1
korrekt
Sök efter nummer 1
i uppsättningen:[111,222,333]. INSTR skulle inte rapportera negativt i detta fall.
SELECT
CASE WHEN REGEXP_COUNT('111,222,333', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END AS cnt
FROM DUAL;
Returnerar 0
korrekt
Exempel med strängar
Sök efter 'John'
i en uppsättning namn:
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;
Returnerar 1
korrekt
Men om du söker efter bokstaven 'a'
, returnerar den korrekt noll (INSTR skulle misslyckas 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;
Returnerar 0
korrekt
Jag vet att den här frågan har besvarats för länge sedan, men den rankas bra i sökresultaten och kan förmodligen hjälpa andra som letar efter en enkel men mer korrekt lösning än Oracles INSTR
funktion.
Booleska uttryck
Det är också möjligt att använda booleska uttryck, som OR
eller OCH
.
Ett exempel med OR
är följande:
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;
Returnerar 1
korrekt, eftersom den hittade "peter" (sök antingen efter "helen" eller "peter" ).
För OCH
tillvägagångssättet är lite annorlunda (ändrar CASE-uttrycket istället för 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;
Ovanstående fråga söker efter både "john" OCH "peter" . OCH
operationen kan implementeras enkelt genom att duplicera REGEXP_COUNT
uttryck i CASE
syntax, dock i gengäld med en liten prestationsstraff.