Kueri saya saat ini terlihat seperti ini:
SELECT * FROM fiberbox f WHERE f.fiberBox LIKE '%1740 %' OR f.fiberBox LIKE '%1938 %' OR f.fiberBox LIKE '%1940 %'
Saya melakukan beberapa melihat-lihat dan tidak dapat menemukan sesuatu yang mirip dengan LIKE IN () - Saya membayangkannya bekerja seperti ini:
SELECT * FROM fiberbox f WHERE f.fiberbox LIKE IN('%140 %', '%1938 %', '%1940 %')
Ada ide? Apakah saya hanya memikirkan masalah dengan cara yang salah - beberapa perintah tidak jelas yang belum pernah saya lihat.
MySQL 5.0.77-komunitas-log
WHERE FIND_IN_SET(f.fiberbox, "1740,1938,1940")
%
Jawaban:
Sebuah regexp mungkin lebih efisien, tetapi Anda harus patokan itu untuk memastikan, misalnya
sumber
REGEXP
sangat lambat, tetapi saya membutuhkan fleksibilitas REGEXP untuk mempersempit hasil yang saya set lebih jauh dari yangLIKE
dapat disediakan. Saya datang dengan solusi hybrid di mana saya menggunakan keduanyaLIKE
danREGEXP
; meskipunREGEXP
porsinya cukup untuk memberi saya hasil yang benar, menggunakanLIKE
MySQL juga memungkinkan untuk mengurangi hasil yang ditetapkan sebelum harus menggunakanREGEXP
kriteria yang lebih lambat .(select group_concat(myColumn separator '|') from..)
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:
Gunakan Alternatif REGEXP:
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:
Menggunakan:
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:
Gunakan Alternatif REGEXP:
ATAU Alternatif Campuran:
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.
sumber
WHERE IFNULL(field, '') NOT REGEXP '1740 | 1938'
Anda dapat membuat tampilan inline atau tabel sementara, mengisinya dengan nilai Anda dan mengeluarkan ini:
Akan tetapi, ini bisa mengembalikan Anda beberapa baris untuk
fiberbox
sesuatu yang mirip'1740, 1938'
, jadi kueri ini lebih cocok untuk Anda:sumber
Cara Regexp dengan daftar nilai
sumber
Maaf, tidak ada operasi yang mirip dengan
LIKE IN
di mysql.Jika Anda ingin menggunakan operator LIKE tanpa bergabung, Anda harus melakukannya dengan cara ini:
Anda tahu, MySQL tidak akan mengoptimalkan permintaan itu, FYI.
sumber
Catat saja kepada siapa pun yang mencoba REGEXP untuk menggunakan fungsionalitas "LIKE IN".
IN memungkinkan Anda melakukan:
Di REGEXP ini tidak akan berfungsi
Itu harus dalam satu baris seperti ini:
sumber
Operan balik
sumber
create table x(en enum('a,b,c')));insert into x values('a'),('b')
en hanya a atau b yang melakukan metode ini dengan membalik oprandselect * from, x where 'a,c' like concat('%',en,'%')
dapat lebih aman dalam SQL Injunction tidak perlu lepas dari karakter seperti $ ^ dll.field
hanya bisa tepata
,b
atauc
Anda harus menggunakannyafield IN ('a', 'b', 'c')
. Tetapi dalam kasus umum, ini TIDAK PERNAH bisa menggantikanfield LIKE '%a%' OR field LIKE '%b%' OR ...
karena bidang itu sendiri bisa menjadi sesuatu sepertimagic
yang akan membuat'magic' LIKE '%a%'
benar tetapi ekspresi'a,b,c' LIKE '%magic%'
salah.Ini benar:
sumber
Sedikit tip:
Saya lebih suka menggunakan varian RLIKE (perintah yang persis sama dengan REGEXP ) karena kedengarannya lebih mirip bahasa alami, dan lebih pendek; baik, hanya 1 char.
Awalan "R" adalah untuk Reg. Exp., Tentu saja.
sumber
Anda bisa mendapatkan hasil yang diinginkan dengan bantuan Ekspresi Reguler .
Kami dapat menguji permintaan di atas, silakan klik SQL biola
Kami dapat menguji permintaan di atas, silakan klik SQL biola
sumber
[...]
adalah set karakter , yang berarti bahwa salah satu karakter dalam set cukup untuk dilihat sebagai pasangan. Jadi setiap nilai dengan angka '0
,1
,3
,4
,7
,8
,9
atau|
karakter pipa akan cocok ini.