35

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文字以上の単語を含むすべてのレコードを返します。

私は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文字以上の単語を含むレコードを返します。

テストとして、私は試しました:

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節のパターンマッチングにあるようです。

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

4

3 に答える 3

51

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

于 2013-02-26T01:11:09.200 に答える
32

@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;

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

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
于 2013-02-26T00:32:29.407 に答える
1

私は以下を使用します:

SELECT COUNT(*)
FROM Person.Person
WHERE LastName COLLATE Latin1_General_CS_AS != upper(LastName) COLLATE Latin1_General_CS_AS
于 2016-03-02T10:35:08.380 に答える