大文字の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
節のパターンマッチングによるようです。
この大文字と小文字を区別した検索を実行するにはどうすればよいですか?
COLLATE Latin1_General_BIN
ではなくCOLLATE Latin1_General_CS_AS
を使用してみてください
@ 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
私は次を使用します:
SELECT COUNT(*)
FROM Person.Person
WHERE LastName COLLATE Latin1_General_CS_AS != upper(LastName) COLLATE Latin1_General_CS_AS