web-dev-qa-db-ja.com

LIKEを使用して大文字と小文字を区別した検索を実行するにはどうすればよいですか?

大文字の6文字以上の英数字の文字列を含むレコードを検索しようとしています。いくつかの例:

PENDING  3RDPARTY  CODE27

私は次の文を使用しています:

SELECT Details
FROM MyTable
WHERE Details LIKE '%[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]%';

これは、大文字小文字に関係なく、6文字以上のWordを含むすべてのレコードを返します。

COLLATEステートメントを追加しました:

SELECT Details
FROM MyTable
WHERE Details COLLATE Latin1_General_CS_AS LIKE '%[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]%';

これは何も変わりません。大文字小文字に関係なく、6文字以上のWordでレコードを返します。

ちょうどテストとして、私は試しました:

SELECT Details
FROM MyTable
WHERE Details COLLATE Latin1_General_CS_AS LIKE '%pending%';

SELECT Details
FROM MyTable
WHERE Details COLLATE Latin1_General_CS_AS LIKE '%PENDING%';

これらは両方とも機能し、それぞれ「pending」と「PENDING」を含むレコードを返しました。したがって、問題はLIKE節のパターンマッチングによるようです。

この大文字と小文字を区別した検索を実行するにはどうすればよいですか?

30
Hand-E-Food

COLLATE Latin1_General_BINではなくCOLLATE Latin1_General_CS_ASを使用してみてください

47
TravellingGeek

@ GeraldSvによる更新:照合を使用Latin1_General_BIN

SELECT Details
FROM MyTable
WHERE Details 
LIKE '%[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]%' 
COLLATE Latin1_General_BIN;

照合指定子afterを列ではなく、照合する文字列を配置する必要があります。

SELECT Details
FROM MyTable
WHERE Details 
LIKE '%[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]%' 
COLLATE Latin1_General_CS_AS;

更新:上記の私の答えは正しいですが、Connectにファイルされたバグがあります: MicrosoftがマークしたCOLLATE Latin1_General_CS_AS のような範囲を使用する場合、Case-SENSITIVITYは機能しません'意図的に"。

AdventureWorks2008R2(大文字と小文字を区別しない、既定の状態)を使用して確認し、Person.Personテーブルで、「n」で終わる3つの姓を「N」に変更し、次のクエリを実行しました。

SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%N' COLLATE Latin1_General_CS_AS

成功。期待どおり3行を返します。

SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[N]' COLLATE Latin1_General_CS_AS

成功。期待どおり3行を返します。

SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[N-N]' COLLATE Latin1_General_CS_AS

成功。期待どおり3行を返します。

SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[M-N]' COLLATE Latin1_General_CS_AS

失敗します。 3334行を返します(すべての姓の末尾が「n」と「N」です)

更新:@GeraldSvのおかげで、これは機能します。

SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[M-N]' COLLATE Latin1_General_BIN
27
Mitch Wheat

私は次を使用します:

SELECT COUNT(*)
FROM Person.Person
WHERE LastName COLLATE Latin1_General_CS_AS != upper(LastName) COLLATE Latin1_General_CS_AS
0
Svensken