Jawaban Paul Dixon sangat membantu saya. Untuk menambah ini, berikut adalah beberapa hal yang saya amati bagi mereka yang tertarik menggunakan REGEXP:
Untuk Menyelesaikan beberapa filter LIKE dengan Wildcard:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field LIKE '%1940 %';
Gunakan Alternatif REGEXP:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |1940 ';
Nilai dalam kutipan REGEXP dan di antara | (OR) operator diperlakukan sebagai wildcard. Biasanya, REGEXP akan membutuhkan ekspresi wildcard seperti (. *) 1740 (. *) Untuk bekerja sebagai% 1740%.
Jika Anda memerlukan kontrol lebih besar atas penempatan wildcard, gunakan beberapa varian ini:
Untuk Menyelesaikan SEPERTI dengan Penempatan Wildcard Terkendali:
SELECT * FROM fiberbox WHERE field LIKE '1740 %'
OR field LIKE '%1938 '
OR field LIKE '%1940 % test';
Menggunakan:
SELECT * FROM fiberbox WHERE field REGEXP '^1740 |1938 $|1940 (.*) test';
Menempatkan ^ di depan nilai mengindikasikan awal baris.
Menempatkan $ setelah nilai menunjukkan ujung baris.
Menempatkan (. *) Berlaku seperti% wildcard.
. menunjukkan karakter tunggal, kecuali jeda baris. Menempatkan. inside () dengan * (. *) menambahkan pola berulang yang menunjukkan sejumlah karakter hingga akhir baris.
Ada cara yang lebih efisien untuk mempersempit pertandingan tertentu, tetapi itu membutuhkan lebih banyak ulasan tentang Ekspresi Reguler. CATATAN: Tidak semua pola regex tampaknya berfungsi dalam pernyataan MySQL. Anda perlu menguji pola Anda dan melihat apa yang berhasil.
Akhirnya, Untuk Menyelesaikan Beberapa LIKE dan NOT LIKE filter:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field NOT LIKE '%1940 %'
OR field NOT LIKE 'test %'
OR field = '9999';
Gunakan Alternatif REGEXP:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |^9999$'
OR field NOT REGEXP '1940 |^test ';
ATAU Alternatif Campuran:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 '
OR field NOT REGEXP '1940 |^test '
OR field NOT LIKE 'test %'
OR field = '9999';
Perhatikan saya memisahkan TIDAK diatur dalam filter WHERE terpisah. Saya bereksperimen dengan menggunakan pola negating, pola berwawasan ke depan, dan sebagainya. Namun, ekspresi ini tampaknya tidak membuahkan hasil yang diinginkan. Pada contoh pertama di atas, saya menggunakan ^ 9999 $ untuk menunjukkan kecocokan persis. Ini memungkinkan Anda untuk menambahkan kecocokan spesifik dengan kecocokan wildcard dalam ekspresi yang sama. Namun, Anda juga dapat mencampur jenis pernyataan ini seperti yang Anda lihat pada contoh kedua yang tercantum.
Mengenai kinerja, saya menjalankan beberapa tes kecil terhadap tabel yang ada dan tidak menemukan perbedaan antara variasi saya. Namun, saya membayangkan kinerja bisa menjadi masalah dengan database yang lebih besar, bidang yang lebih besar, jumlah catatan yang lebih besar, dan filter yang lebih kompleks.
Seperti biasa, gunakan logika di atas karena itu masuk akal.
Jika Anda ingin mempelajari lebih lanjut tentang ekspresi reguler, saya sarankan www.regular-expressions.info sebagai situs referensi yang bagus.
WHERE FIND_IN_SET(f.fiberbox, "1740,1938,1940")