SQLの大文字と小文字を区別する文字列の比較


234

どのように文字列を比較して、各文字列の大文字小文字が等しい場合にのみ比較が真になるようにしますか。例えば:

Select * from a_table where attribute = 'k'

...属性「K」の行を返します。私はこの行動を望んでいません。


必要としない場合もありますが、照合順序を変更したり、クエリで特定の照合順序を使用したりできます。
ケーン

7
どのSQL製品ですか?
onedaywhen

回答:


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

トリックをしました。


4
私は通常、Latin1_General_Binを使用します
gbn

3
はい、標準的なアプローチは、大文字と小文字を区別しない照合を使用することですが、照合自体はベンダー固有です。SQL Serverの構文ですか?
onedaywhen

私の場合、dbに大文字と小文字を区別する1つの列があります。標準(CI)列と比較する必要がありました。私はこのWHERE Foo.Bar =(Baz.Bar COLLATE Latin1_General_CS_AS)のバリエーションを使用しました
Hypnovirus

2
ありがとうございますが、Latin1_General_CS_ASとは何ですか?特別なキーワードですか?
Vijay Singh Rana

2
@VijaySinghRana Latin1_General_CS_ASは、照合の仕様です。照合順序とは、データのソート方法と比較方法を決定する一連のルールを指します。詳細については、このページを参照してください
amccormack 2015

51

次の構文を使用して、大文字と小文字区別するようにその属性を変換することもできます。

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

これで、検索で大文字と小文字が区別されます。

その列の大文字と小文字を区別しないようにするには、次を使用します。

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

29

列はVARBINARY(Max Length)に簡単に変換できます。長さは、比較の欠陥を回避するために予想される最大長でなければなりません。列の長さとして長さを設定するだけで十分です。列のトリムは、スペースが意味を持ち、テーブルの列で評価されている場合を除いて、実際の値を比較するのに役立ちます。これは簡単なサンプルです。列の値をトリムしてから変換して比較します。

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

この助けを願っています。


2
まさに私が探していたもの。大文字を含むエントリを見つけるために、大文字と小文字を区別する1回限りの比較を行う簡単な方法。
Mike D.

20

別の方法として、次のようなHASHBYTESを使用できます。

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

1
衝突はどうですか?まれですが、同じ値にハッシュされる文字列が複数あると思います。
David Klempfner、

可能ですが、このような単純な文字列の例では非常にまれだと思いました。
Dave Sexton

@DavidKlempfnerなぜ最初に比較を行わないのか、それらが一致する場合はハッシュバイトもチェックするのはなぜですか?これを関数にして、StringsAreCaseSensitiveEqual(a、b)=> a = b AND HASHBYTES( 'sha1'、a)= HASHBYTES( 'sha1'、b)のように呼び出すことができます
Demetris Leptos

3

attributeとして定義するBINARYか、INSTRまたはSTRCMPを使用して検索を実行できます。


この返信は、質問タグによるとSQL Serverに関するものではないようです。DBMSは、これらの欠けているINSTRSTRCMP機能を。
Jonas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.