Nejedná se o přesnou alternativu k MySQL FIND_IN_SET
, ale ve vašem příkladu (kde potřebujete vědět pouze POKUD je hodnota obsažena v sadě oddělené čárkami) Oracle REGEX_COUNT
s regulárním výrazem '^([^,]+,)*your_value(,[^,]+)*$'
bude sedět.
Prozkoumejte následující dotazy SQL (pro Oracle)...
Příklady s čísly
Vyhledejte číslo 1
v sadě:[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;
Vrátí 1
správně
Vyhledejte číslo 1
v souboru:[111 222 333]. INSTR by v tomto případě nevykazoval negativní výsledek.
SELECT
CASE WHEN REGEXP_COUNT('111,222,333', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END AS cnt
FROM DUAL;
Vrátí 0
správně
Příklady s řetězci
Vyhledejte 'John'
v sadě jmen:
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;
Vrátí 1
správně
Ale pokud hledáte písmeno 'a'
, správně vrátí nulu (INSTR by znovu selhal).
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;
Vrátí 0
správně
Vím, že tato otázka byla zodpovězena již dávno, ale ve výsledcích vyhledávání se řadí dobře a pravděpodobně by mohla pomoci ostatním, kteří hledají jednoduché, ale správnější řešení než INSTR
společnosti Oracle. funkce.
Booleovské výrazy
Je také možné použít booleovské výrazy, jako je OR
nebo AND
.
Příklad pomocí OR
je následující:
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;
Vrátí 1
správně, protože našel "peter" (hledejte buď "helen" nebo "petr" ).
Pro AND
přístup je trochu jiný (upravuje výraz CASE místo regulárního výrazu ):
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;
Výše uvedený dotaz hledá oba "john" A "petr" . AND
operaci lze snadno implementovat duplikováním REGEXP_COUNT
výraz v CASE
syntaxe, ale na oplátku s malou výkonnostní penalizací.