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í.