SQL Büyük / Küçük Harfe Duyarlı Dize Karşılaştır


234

Dizeleri nasıl karşılaştırırsınız, böylece karşılaştırma yalnızca dizelerin her birinin durumu da eşitse doğrudur. Örneğin:

Select * from a_table where attribute = 'k'

... 'K' özelliğine sahip bir satır döndürür. Bu davranışı istemiyorum.


İhtiyacınız olan şey olmayabilir, ancak Harmanlamayı değiştirebilir veya sorgunuzda belirli bir Harmanlama kullanabilirsiniz.
Kane

7
Hangi SQL ürünü?
oneday20

Yanıtlar:


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

Hile yaptı.


4
Normalde Latin1_General_Bin
gbn

3
Evet, Standart yaklaşımı büyük / küçük harfe duyarlı olmayan bir harmanlama kullanmaktır, ancak harmanlamaların kendisi satıcıya özgüdür. Sizinki SQL Server sözdizimi mi?
oneday20

Benim durumumda, benim db büyük / küçük harf duyarlı sütun var. Standart (CI) sütun ile karşılaştırmak gerekiyordu. Bu WHERE Foo.Bar = (Baz.Bar COLLATE Latin1_General_CS_AS)
Hypnovirus

2
Teşekkürler ama Latin1_General_CS_AS nedir ?? Özel bir anahtar kelime mi?
Vijay Singh Rana

2
@VijaySinghRana Latin1_General_CS_ASharmanlamanın bir özelliğidir. Harmanlama, verilerin nasıl sıralanacağını ve karşılaştırılacağını belirleyen bir dizi kuralı ifade eder. Daha fazla bilgi için bu sayfaya bakın .
amccormack

51

Bu sözdizimini kullanarak bu özelliği büyük / küçük harfe duyarlı olarak da dönüştürebilirsiniz :

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

Şimdi aramanız büyük / küçük harfe duyarlı olacaktır .

Bu sütun durumunu tekrar duyarsız hale getirmek istiyorsanız şunu kullanın:

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

29

Sütunları kolayca VARBINARY (Maks. Uzunluk) biçimine dönüştürebilirsiniz, Uzunluk, hatalı karşılaştırmayı önlemek için beklediğiniz maksimum olmalıdır, Uzunluğu sütun uzunluğu olarak ayarlamak yeterlidir. Döşeme sütunu, alanın bir anlamı ve tablo sütunlarınızda değerli olması dışında gerçek değeri karşılaştırmanıza yardımcı olur.

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

Umarım bu yardım.


2
tam olarak aradığım şey. Büyük harfli karakterler içeren girdileri bulmak için tek seferlik, büyük / küçük harfe duyarlı bir karşılaştırma yapmanın basit bir yolu.
Mike

20

Başka bir alternatif olarak HASHBYTES'i kullanabilirsiniz, şöyle bir şey:

SELECT * 
FROM a_table 
WHERE HASHBYTES('sha1', attribute) = HASHBYTES('sha1', 'k')

1
Çarpışmalar ne olacak? Nadir olurdu ama aynı değere hash çoklu dizeleri olacağını varsayalım.
David Klempfner

Evet mümkün, ama böyle basit bir dize örneği üzerinde son derece nadir düşünürdüm.
Dave Sexton

@DavidKlempfner neden ilk önce karşılaştırmayı yapmıyorsunuz ve eğer eşleşirlerse hashbytes'i de kontrol ettiniz mi? Bunu bir işlev haline getirebilir ve StringsAreCaseSensitiveEqual (a, b) => a = b AND HASHBYTES ('sha1', a) = HASHBYTES ('sha1', b)
26'da Demetris Leptos

3

Aramanızı gerçekleştirmek için veya attributeolarak tanımlayabilir BINARYveya kullanabilirsiniz .INSTRSTRCMP


Bu yanıt, soru etiketi başına SQL Server ile ilgili görünmüyor. DBMS bunlardan INSTRve STRCMPişlevlerinden yoksundur .
Jonas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.