Não é uma alternativa exata para
REGEX_COUNT
com a regex '^([^,]+,)*your_value(,[^,]+)*$'
vai caber. Examine as seguintes consultas SQL (para Oracle)...
Exemplos com números
Pesquise o número
1
no conjunto:[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;
Retorna
1
corretamente Pesquise o número
1
no conjunto:[111.222.333]. O INSTR não reportaria negativo neste caso. SELECT
CASE WHEN REGEXP_COUNT('111,222,333', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END AS cnt
FROM DUAL;
Retorna
0
corretamente Exemplos com strings
Procure por
'João'
em um conjunto de nomes: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;
Retorna
1
corretamente Mas se você pesquisar pela letra
'a'
, ele retornará corretamente zero (INSTR falharia novamente). 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;
Retorna
0
corretamente Eu sei que esta pergunta foi respondida há muito tempo, mas ela está bem classificada nos resultados da pesquisa e provavelmente pode ajudar outras pessoas que procuram uma solução simples, mas mais correta do que o
INSTR
da Oracle função. Expressões booleanas
Também é possível usar expressões booleanas, como
OR
ou E
. Um exemplo usando
OR
é o seguinte: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;
Retorna
1
corretamente, pois encontrou "peter" (procure por "helen" ou "pedro" ). Para
E
a abordagem é um pouco diferente (altera a expressão CASE em vez da 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;
A consulta acima procura por "john" E "pedro" . O
E
operação pode ser implementada facilmente duplicando o REGEXP_COUNT
expressão no CASE
sintaxe, porém em troca com uma pequena penalidade de desempenho.