SQL - Abaikan case saat mencari string

130


Saya memiliki data berikut dalam tabel
PriceOrderShipped
PriceOrderShippedInbound
PriceOrderShippedOutbound

Dalam SQL saya perlu menulis kueri yang mencari string dalam tabel. Saat mencari string, ia harus mengabaikan case. Untuk query SQL yang disebutkan di bawah ini

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%PriceOrder%' 

memberikan semua data di atas, sedangkan

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%Priceorder%' 

tidak memberi.

Misalnya. ketika saya mencari 'PriceOrder' atau 'priceOrder' berfungsi tetapi 'priceorder' atau 'Priceorder' tidak berfungsi. Saya sudah mencoba dengan query di bawah ini menggunakan COLLATE, tetapi tidak berfungsi. Biarkan saya tahu di mana saya salah.

SELECT DISTINCT COL_NAME FROM myTable WHERE 
COL_NAME COLLATE latin1_general_cs LIKE '%Priceorder%'
gelombang kejut
sumber
Kemungkinan duplikat dari server SQL mengabaikan kasus di mana ekspresi
Liam

Jawaban:

232

Gunakan sesuatu seperti ini -

SELECT DISTINCT COL_NAME FROM myTable WHERE UPPER(COL_NAME) LIKE UPPER('%PriceOrder%')

atau

SELECT DISTINCT COL_NAME FROM myTable WHERE LOWER(COL_NAME) LIKE LOWER('%PriceOrder%')
Aditya Kakirde
sumber
14
Saya pikir Anda harus selalu membandingkan string dengan huruf kapital (UPPER) sebagai praktik terbaik. Google "turki i"
Traubenfuchs
2
Ingin tahu apakah jawaban Anda memiliki masalah kinerja dengan mengonversi nilai kolom ke UPPERatau LOWERcase lalu menggunakan LIKEto search?
shaijut
Sebenarnya Anda harus membandingkan varian UPPER dan LOWER karena beberapa karakter memiliki representasi berbeda dalam huruf besar tetapi representasi yang sama dalam huruf kecil. Untuk karakter lain, kebalikannya mungkin benar. Java menyebutkan alfabet Georgia secara khusus sebagai alasan untuk melakukan toLowerCase tambahan () dalam perbandingan case-insensitive-nya.
Crusha K. Rool
1
Sayangnya, pendekatan ini menyebabkan pemindaian tabel penuh seperti yang dijelaskan dalam posting ini: alvinalexander.com/sql/… . Pencarian indeks tidak dapat diterapkan, karena kolom yang difilter dimodifikasi oleh fungsi UPPER / LOWER.
Jeff S.
Mengatur collation (sebelum membuat indeks) tampaknya menjadi pendekatan yang lebih baik jika kinerja permintaan dengan atas / bawah tidak cukup.
Jeff S.
10

Lihat pertanyaan dan jawaban serupa ini untuk pencarian dengan case-insensitivity - SQL server Abaikan dalam ekspresi mana

Coba gunakan sesuatu seperti:

SELECT DISTINCT COL_NAME 
FROM myTable 
WHERE COL_NAME COLLATE SQL_Latin1_General_CP1_CI_AS LIKE '%priceorder%'
Miguel-F
sumber
ini tidak berfungsi. Saya mendapatkan query SQL yang tidak diakhiri sebelum Collate
shockwave
@ Miguel-F .. ini berfungsi dengan baik tetapi bagaimana bedanya dengan SELECT DISTINCT COL_NAME DARI myTable WHERE COL_NAME LIKE '% priceorder%' karena ini juga berfungsi dengan baik untuk saya ..
Jishant
Saya akan menyarankan menggunakan 'SQL_Latin1_General_Cp1_CI_AS_KI_WI' sebagai gantinya. Ini bukan kasus sensitif untuk pencarian.
user8155123
8

Seperti ini.

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME iLIKE '%Priceorder%'

Dalam postgresql.

Hangk
sumber
4
Pertanyaan ini ditandai dengan sql-server sehingga jawaban postgres tidak relevan.
Liam
4

Anda mungkin harus menggunakan SQL_Latin1_General_Cp1_CI_AS_KI_WIsebagai koleksi Anda. Yang Anda tentukan dalam pertanyaan Anda sangat peka huruf besar-kecil.

Anda dapat melihat daftar koleksi di sini .


sumber