Не е точна алтернатива на <на MySQL код>FIND_IN_SET
, но във вашия примерен случай (където трябва да знаете само АКО дадена стойност се съдържа в набор, разделен със запетая) REGEX_COUNT
с регулярния израз '^([^,]+,)*your_value(,[^,]+)*$'
ще пасне.
Разгледайте следните SQL заявки (за Oracle)...
Примери с числа
Потърсете номер 1
в комплекта:[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;
Връща 1
правилно
Потърсете номер 1
в комплекта:[111,222,333]. INSTR няма да успее да докладва отрицателно в този случай.
SELECT
CASE WHEN REGEXP_COUNT('111,222,333', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END AS cnt
FROM DUAL;
Връща 0
правилно
Примери с низове
Потърсете 'John'
в набор от имена:
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;
Връща 1
правилно
Но ако търсите буква 'a'
, ще върне правилно нула (INSTR отново ще се провали).
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;
Връща 0
правилно
Знам, че на този въпрос е отговорено отдавна, но той се класира добре в резултатите от търсенето и вероятно може да помогне на други, които търсят просто, но по-правилно решение от INSTR
на Oracle функция.
Булеви изрази
Възможно е също да използвате булеви изрази, като OR
или И
.
Пример за използване на OR
е следното:
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;
Връща 1
правилно, тъй като намери "peter" (потърсете или "helen" или "петър" ).
За И
подходът е малко по-различен (променя CASE израза вместо регулярния израз ):
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;
Горната заявка търси както "john" И "петър" . И
операцията може да се приложи лесно чрез дублиране на REGEXP_COUNT
израз в CASE
синтаксис, но в замяна с малка грешка в производителността.