SQL Case Sensitive String Bandingkan

234

Bagaimana Anda membandingkan string sehingga perbandingannya benar hanya jika kasus masing-masing string sama. Sebagai contoh:

Select * from a_table where attribute = 'k'

... akan mengembalikan baris dengan atribut 'K'. Saya tidak ingin perilaku ini.

amccormack
sumber
Mungkin bukan yang Anda butuhkan tetapi Anda dapat mengubah Collation atau menggunakan Collation tertentu dalam permintaan Anda.
Kane
7
Produk SQL apa?
onedaywhen

Jawaban:

388
Select * from a_table where attribute = 'k' COLLATE Latin1_General_CS_AS 

Lakukan triknya.

amccormack
sumber
4
Saya biasanya menggunakan Latin1_General_Bin
gbn
3
Ya, pendekatan Standar adalah dengan menggunakan susunan case-insensitive, meskipun susunan itu sendiri khusus untuk vendor. Apakah Anda sintaks SQL Server?
onedaywhen
Dalam kasus saya, saya memiliki 1 kolom di db yang peka terhadap huruf besar-kecil. Saya perlu membandingkannya dengan kolom standar (CI). Saya menggunakan variasi ini WHERE Foo.Bar = (Baz.Bar COLLATE Latin1_General_CS_AS)
Hypnovirus
2
Terima kasih tapi apa itu Latin1_General_CS_AS ?? Apakah itu kata kunci khusus?
Vijay Singh Rana
2
@VijaySinghRana Latin1_General_CS_ASadalah spesifikasi pemeriksaan. Collation mengacu pada seperangkat aturan yang menentukan bagaimana data diurutkan dan dibandingkan. Lihat halaman ini untuk informasi lebih lanjut.
amccormack
51

Anda juga dapat mengonversi atribut itu sebagai case sensitif menggunakan sintaks ini:

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CS_AS

Sekarang pencarian Anda akan peka huruf besar-kecil .

Jika Anda ingin membuat case kolom tidak sensitif lagi, maka gunakan

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CI_AS
Jugal
sumber
29

Anda Dapat dengan mudah mengkonversi kolom menjadi VARBINARY (Panjang Maks), Panjangnya harus maksimum yang Anda harapkan untuk menghindari perbandingan yang rusak, Cukup untuk mengatur panjang sebagai panjang kolom. Potong kolom membantu Anda untuk membandingkan nilai nyata kecuali ruang memiliki arti dan dihargai di kolom tabel Anda, Ini adalah contoh sederhana dan seperti yang Anda lihat saya Trim nilai kolom dan kemudian konversi dan bandingkan .:

CONVERT(VARBINARY(250),LTRIM(RTRIM(Column1))) = CONVERT(VARBINARY(250),LTRIM(RTRIM(Column2)))

Semoga bantuan ini.

QMaster
sumber
2
persis apa yang saya cari. Cara sederhana untuk melakukan perbandingan satu kali dan case-sensitive untuk menemukan entri yang berisi karakter huruf besar.
Mike D.
20

Sama seperti alternatif lain Anda dapat menggunakan HASHBYTES, sesuatu seperti ini:

SELECT * 
FROM a_table 
WHERE HASHBYTES('sha1', attribute) = HASHBYTES('sha1', 'k')
Dave Sexton
sumber
1
Bagaimana dengan tabrakan? Itu akan jarang tetapi saya berasumsi akan ada beberapa string yang hash dengan nilai yang sama.
David Klempfner
Ya mungkin, tetapi sangat jarang pada contoh string sederhana seperti yang saya pikirkan.
Dave Sexton
@ Davidvidemplner mengapa tidak pertama-tama melakukan perbandingan dan jika mereka cocok maka periksa juga hashbytes? Kita dapat membuat fungsi ini dan memanggilnya seperti StringsAreCaseSensitiveEqual (a, b) => a = b DAN HASHBYTES ('sh1', a) = HASHBYTES ('sh1', b)
Demetris Leptos
3

Anda dapat menentukan attributesebagai BINARYatau menggunakan INSTRatau STRCMPuntuk melakukan pencarian Anda.

MatTheCat
sumber
Balasan ini sepertinya bukan tentang SQL Server per tag pertanyaan. DBMS tidak memiliki ini INSTRdan STRCMPfungsinya.
Jonas