Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Apa alternatif dari Find_in_set dari mysql di Oracle?

Bukan alternatif yang tepat untuk MySQL FIND_IN_SET , tetapi dalam contoh kasus Anda (di mana Anda hanya perlu mengetahui JIKA suatu nilai terkandung dalam set yang dipisahkan koma) Oracle REGEX_COUNT dengan regex '^([^,]+,)*your_value(,[^,]+)*$' akan cocok.

Periksa kueri SQL berikut (untuk Oracle)...

Contoh dengan angka

Cari nomor 1 di set:[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;

Mengembalikan 1 dengan benar

Cari nomor 1 di set:[111.222.333]. INSTR akan gagal melaporkan negatif dalam kasus ini.

SELECT
    CASE WHEN REGEXP_COUNT('111,222,333', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
        THEN 1 ELSE 0
    END AS cnt
FROM DUAL;

Mengembalikan 0 dengan benar

Contoh dengan string

Telusuri 'John' dalam satu set nama:

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;

Mengembalikan 1 dengan benar

Tetapi jika Anda mencari huruf 'a' , itu akan mengembalikan nol dengan benar (INSTR akan gagal lagi).

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;

Mengembalikan 0 dengan benar

Saya tahu pertanyaan ini telah dijawab sejak lama, tetapi peringkatnya baik dalam hasil pencarian dan mungkin membantu orang lain yang mencari solusi sederhana tetapi lebih tepat daripada INSTR Oracle fungsi.

Ekspresi Boolean

Dimungkinkan juga untuk menggunakan ekspresi Boolean, seperti OR atau AND .

Contoh menggunakan OR adalah sebagai berikut:

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;

Mengembalikan 1 dengan benar, karena menemukan "peter" (cari salah satu "helen" atau "peter" ).

Untuk AND pendekatannya sedikit berbeda (mengubah ekspresi CASE alih-alih 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;

Kueri di atas mencari keduanya "john" DAN "peter" . AND operasi dapat diimplementasikan dengan mudah dengan menduplikasi REGEXP_COUNT ekspresi dalam CASE sintaks, namun sebagai imbalannya dengan penalti kinerja kecil.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle menghapus data dari tabel SQL Server jarak jauh

  2. Perbaiki:"presisi terkemuka dari interval terlalu kecil" di Oracle Database

  3. Performa lambat di Hibernate + Java tetapi cepat ketika saya menggunakan TOAD dengan kueri Oracle asli yang sama

  4. Bagaimana cara menggabungkan tanpa menggunakan `GROUP BY`?

  5. Fungsi jendela SORT mahal, bisakah kita mengatasinya?