2016-08-10 6 views
1

私は以下のようなテーブルを持っており、入力パラメータが 'William'です。 したがって、大文字と小文字を区別するために、入力パラメータをTable1.Nameに一致させる必要があります。大文字の大文字小文字が見つからない場合は、小文字を返す必要があります。SQLロジックは一致する場合のみ大文字を返します。それ以外の場合は小文字を返します。

Table1 
ID | Name 
1 | William 
2 | WILLIAM 
3 | ROSE 
4 | Rose 

以下のクエリを使用して、何らかの理由ですべてのケースで期待される結果が得られませんでした。

Select * from 
    Table1 
Where 
    Table1.Name COLLATE Latin1_General_CS_AI = 
      (CASE WHEN 'William' COLLATE Latin1_General_BIN LIKE '%[a-z]%' 
        THEN UPPER('William') 
       ELSE 'William' END) 
+0

あなたの実際の結果と予想される結果が何であるかを明確にしてください。 – sstan

+1

大文字と小文字を区別するクエリを頻繁に行う必要がありますか、これは1回限りのイベントですか? – StingyJack

答えて

3

あなたのコラムは、現在あなたが照合として

SELECT TOP 1 WITH TIES * 
FROM Table1 
WHERE Name = 'William' 
ORDER BY CASE 
      WHEN Name = UPPER('William') COLLATE Latin1_General_CS_AI 
       THEN 0 
      ELSE 1 
      END 

を使用することができます大文字小文字を区別しない照合を持っていると仮定すると、それがバックウィリアムのすべての変形をもたらす大文字と小文字を区別しません。 "WILLIAM"と一致するものは0となり、他のバリアントと一致するものは1となり、TOP 1 WITH TIESは結果に存在する最も低いスコアのグループを保持します。

+1

簡単にエレガント。お世話になりました。 –

+0

ありがとうございました!出来た。 – user3600663

0

where clauseCASE WHENを使用しないでください。 Collationを変更することができます。

DECLARE @Input NVARCHAR(50) = 'William' 

SELECT * 
FROM 
    Tbl T 
WHERE 
    T.Name = UPPER(@Input) COLLATE SQL_Latin1_General_CP1_CS_AS OR 
    (
     NOT EXISTS 
     (
      SELECT 1 FROM Tbl IT 
      WHERE 
       IT.Name = UPPER(@Input) COLLATE SQL_Latin1_General_CP1_CS_AS 
     ) AND 
     T.Name = @Input COLLATE SQL_Latin1_General_CP1_CS_AS 
    ) 
関連する問題