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.