Saya punya daftar sederhana ~ 25 kata. Saya memiliki bidang varchar di PostgreSQL, katakanlah daftar itu ['foo', 'bar', 'baz']
. Saya ingin menemukan baris di meja saya yang memiliki kata-kata itu. Ini akan berhasil, tetapi saya ingin sesuatu yang lebih elegan.
select *
from table
where (lower(value) like '%foo%' or lower(value) like '%bar%' or lower(value) like '%baz%')
sql
postgresql
chmullig
sumber
sumber
SIMILAR TO
diterjemahkan secara internal ke pencarian regexlower()
tidak efektif karena pertama-tama akan mengkonversi setiap string menjadi huruf kecil, yang lebih mahal daripada hanya pertandingan dengan huruf besar-kecilPostgreSQL juga mendukung ekspresi reguler POSIX lengkap :
Ini
~*
untuk pertandingan yang tidak peka huruf besar kecil,~
peka huruf besar kecil.Pilihan lain adalah menggunakan APA PUN :
Anda dapat menggunakan APA SAJA dengan operator apa pun yang menghasilkan boolean. Saya menduga bahwa opsi regex akan lebih cepat tetapi APAPUN adalah alat yang berguna untuk ada di kotak peralatan Anda.
sumber
Sebenarnya ada operator untuk itu di PostgreSQL:
sumber
~~
hanyalah nama lain untuklike
: "Operator~~
setara denganLIKE
, dan~~*
sesuai denganILIKE
. Ada juga!~~
dan!~~*
operator yang mewakiliNOT LIKE
danNOT ILIKE
, masing-masing. Semua operator ini adalah khusus PostgreSQL." . Dan'{%foo%,%bar%,%baz%}'
merupakan bentuk teks dariarray['%foo%', '%bar%', '%baz%']
.SIMILAR TO
dikonversi menjadi Ekspresi Reguler,~
operator adalah singkatan dari Ekspresi Reguler POSIX, tetapi ini tidak jelas untukLIKE
.Satu solusi 'elegan' adalah dengan menggunakan pencarian teks lengkap: http://www.postgresql.org/docs/9.0/interactive/textsearch.html . Maka Anda akan menggunakan permintaan pencarian teks lengkap.
sumber