Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jaka jest alternatywa dla Find_in_set mysql w Oracle?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Interakcja blokady SELECT FOR UPDATE z kursorem i wsadowym DML

  2. porównywanie dwóch kursorów w Oracle zamiast używania MINUS

  3. Dane tabel Oracle do instrukcji INSERT z JAVA

  4. SQL do wygenerowania listy liczb od 1 do 100

  5. Pobieranie XML z pięciu różnych tabel Oracle