Apakah ada cara untuk menulis query case-insensitive di PostgreSQL, Mis. Saya ingin 3 query berikut mengembalikan hasil yang sama.
SELECT id FROM groups where name='administrator'
SELECT id FROM groups where name='ADMINISTRATOR'
SELECT id FROM groups where name='Administrator'
postgresql
Jame
sumber
sumber
Jawaban:
Gunakan fungsi RENDAH untuk mengkonversi string ke huruf kecil sebelum membandingkan.
Coba ini:
sumber
varchar_pattern_ops
jika Anda ingin indeks berfungsi denganLIKE 'xxx%'
kueri, yaituCREATE INDEX ix_groups_name ON groups (lower(name) varchar_pattern_ops)
.ILIKE
, Ini akan berhasilbut with slow response
,. Untuk mendapatkan akses cepat ke tabel berdasarkan hasil perhitungan, saya sarankan siapa pun yang hanya memeriksa ini harus pergi dengan jawaban yang diterima. Lihat detail lebih lanjut di sini dan di sinimenggunakan
ILIKE
bukanLIKE
sumber
ILIKE
tidak didukung oleh Hibernate saat digunakan di Spring Boot.org.hibernate.dialect.PostgreSQL94Dialect
dan Spring Boot 2.0.6.RELEASE. Tapi IntelliJ mengeluhkan hal itu.Pendekatan yang paling umum adalah untuk huruf kecil atau huruf besar string pencarian dan data. Tapi ada dua masalah dengan itu.
Setidaknya ada tiga solusi yang jarang digunakan yang mungkin lebih efektif.
CREATE INDEX ON groups (name::citext);
. (Tapi lihat di bawah.)CREATE INDEX ON groups (LOWER(name));
. Setelah melakukannya, Anda dapat mengambil keuntungan dari indeks dengan pertanyaan sepertiSELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');
, atauSELECT id FROM groups WHERE LOWER(name) = 'administrator';
Anda harus ingat untuk menggunakan RENDAH ().Modul citext tidak memberikan tipe data case-insensitive yang sebenarnya. Sebaliknya, ia berperilaku seolah-olah setiap string lebih kecil. Artinya, berperilaku seolah-olah Anda telah memanggil
lower()
setiap string, seperti pada angka 3 di atas. Keuntungannya adalah bahwa programmer tidak perlu mengingat string huruf kecil. Tetapi Anda perlu membaca bagian "Perilaku Perbandingan String" dan "Keterbatasan" dalam dokumen sebelum Anda memutuskan untuk menggunakan citext.sumber
col = 'a'
dancol = 'b'
). Tentang # 2: Seperti yang Anda katakan, Anda bisa membuat indeks pada ekspresi, jadi itu bukan masalah. Tapi saya setuju dengan Anda bahwa mengubah susunan adalah solusi terbaik.select * from pg_collation;
.Anda bisa menggunakannya
ILIKE
. yaitusumber
lower
fungsi ini. Lihat lebih detailAnda juga dapat membaca
ILIKE
kata kunci. Kadang-kadang bisa sangat berguna, meskipun tidak sesuai dengan standar SQL. Lihat di sini untuk informasi lebih lanjut: http://www.postgresql.org/docs/9.2/static/functions-matching.htmlsumber
email ILIKE 'user-input-email-here'
, pastikan untuk keluar dari input pengguna. Kalau tidak, orang dapat memasukkan karakter seperti% yang cocok dengan apa pun.ILIKE
danprepared statements
apakah ini akan melindungi saya darisql injection
?lower(column_name) like %expression%
.Anda juga bisa menggunakan ekspresi reguler POSIX, seperti
SELECT 'asd' ~* 'AsD'
kembalit
sumber
Penggunaan
~*
dapat sangat meningkatkan kinerja, dengan fungsionalitas INSTR.kembalikan baris dengan nama yang mengandung ATAU sama dengan 'adm'.
sumber