Nie jest to dokładna alternatywa dla FIND_IN_SET
, ale w twoim przykładzie (gdzie musisz wiedzieć tylko JEŻELI wartość jest zawarta w zestawie oddzielonym przecinkami) REGEX_COUNT
z wyrażeniem regularnym '^([^,]+,)*your_value(,[^,]+)*$'
zmieści się.
Sprawdź następujące zapytania SQL (dla Oracle)...
Przykłady z liczbami
Wyszukaj numer 1
w zestawie:[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;
Zwraca 1
poprawnie
Wyszukaj numer 1
w zestawie:[111 222 333]. W takim przypadku INSTR nie zgłosi negatywnego wyniku.
SELECT
CASE WHEN REGEXP_COUNT('111,222,333', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END AS cnt
FROM DUAL;
Zwraca 0
poprawnie
Przykłady z ciągami
Wyszukaj 'John'
w zestawie nazw:
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;
Zwraca 1
poprawnie
Ale jeśli szukasz litery 'a'
, poprawnie zwróci zero (INSTR ponownie się nie powiedzie).
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;
Zwraca 0
poprawnie
Wiem, że odpowiedź na to pytanie została udzielona już dawno temu, ale zajmuje dobre miejsce w wynikach wyszukiwania i prawdopodobnie może pomóc innym, którzy szukają prostego, ale bardziej poprawnego rozwiązania niż INSTR
Oracle funkcja.
Wyrażenia logiczne
Możliwe jest również użycie wyrażeń logicznych, takich jak OR
lub AND
.
Przykład użycia OR
jest następująca:
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;
Zwraca 1
poprawnie, ponieważ znalazł "peter" (wyszukaj albo "helen" lub "piotr" ).
Dla AND
podejście jest trochę inne (zmienia wyrażenie CASE zamiast regexu ):
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;
Powyższe zapytanie wyszukuje zarówno „jan” ORAZ "piotr" . AND
operację można łatwo zaimplementować, powielając REGEXP_COUNT
wyrażenie w CASE
składnia, jednak w zamian z niewielką utratą wydajności.