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.