SQLサーバーはwhere式の大文字小文字を無視します
-
11-07-2019 - |
質問
SQLクエリ(MS SQL Server)を作成するにはどうすればよいですか?句は大文字と小文字を区別しませんか?
SELECT * FROM myTable WHERE myField = 'sOmeVal'
ケースを無視して結果が戻ってくるようにしたい
解決
SQL Serverデータベースのデフォルト構成では、文字列比較は大文字と小文字を区別しない です。データベースが(代替照合を使用して)この設定をオーバーライドする場合、クエリで使用する照合の種類を指定する必要があります。
SELECT * FROM myTable WHERE myField = 'sOmeVal' COLLATE SQL_Latin1_General_CP1_CI_AS
私が提供した照合順序は単なる例であることに注意してください(ただし、それはおそらくあなたにとってうまく機能するでしょう)。 SQL Server照合のより詳細な概要は、こちらで見つけることができます。
他のヒント
通常、文字列比較では大文字と小文字が区別されません。データベースで大文字と小文字を区別する照合が設定されている場合、大文字と小文字を区別しない照合を強制的に使用する必要があります。
SELECT balance FROM people WHERE email = 'billg@microsoft.com'
COLLATE SQL_Latin1_General_CP1_CI_AS
別の場所で別の解決策を見つけました。つまり、使用する
upper(@yourString)
しかし、SQL Serverでは、とにかく大文字と小文字を無視しているので、それは重要ではない、と言っています。データベースでは大文字と小文字が区別されると確信しています。
いいえ、 LIKE
のみを使用しても機能しません。 LIKE
は、指定されたパターンに正確に一致する値を検索します。この場合、 LIKE
はテキスト「sOmeVal」のみを検索し、「someval」は検索しません。
実用的なソリューションは、 LCASE()
関数を使用することです。 LCASE( 'sOmeVal')
は、テキストの小文字の文字列「someval」を取得します。この関数を比較の両側に使用すると、機能します:
SELECT * FROM myTable WHERE LCASE(myField)LIKE LCASE( 'sOmeVal')
このステートメントは2つの小文字の文字列を比較するため、「sOmeVal」は「someval」の他のすべての表記と一致します(例:「Someval」、「sOMEVAl」など)。
上位2つの回答( Adam Robinson および Andrejs Cainikovs )は、技術的には機能するという点で、やや正しいですが、説明が間違っているため、多くの場合誤解を招く可能性があります。たとえば、 SQL_Latin1_General_CP1_CI_AS
照合は多くの場合に機能しますが、大文字と小文字を区別しない適切な照合と見なされるべきではありません。実際、OPが大文字と小文字を区別する(またはおそらくバイナリ)照合を使用してデータベースで動作していることを考えると、OPは非常に多くのインストール(特にOSにインストールされたもの)のデフォルトである照合を使用していないことがわかります言語として米国英語を使用)): SQL_Latin1_General_CP1_CI_AS
。もちろん、OPは SQL_Latin1_General_CP1_CS_AS
を使用している可能性がありますが、 VARCHAR
データを使用する場合は、コードページを変更しないことが重要です。データ損失、および照合のロケール/カルチャによって制御されます(つまり、Latin1_General vsフランス語vsヘブライ語など)。以下のポイント9を参照してください。
他の4つの答えは、程度がさまざまです。
読者が最も適切で効率的な選択を行えるように、ここでの誤解をすべて明確にします。
-
UPPER()
は使用しないでください。それは完全に不必要な余分な作業です。COLLATE
句を使用します。どちらの場合も文字列の比較を行う必要がありますが、UPPER()
を使用して、文字ごとにチェックし、大文字のマッピングがあるかどうかを確認してから変更する必要があります。そして、両側でこれを行う必要があります。COLLATE
を追加すると、デフォルトで行われるのとは異なるルールセットを使用してソートキーを生成するように処理が指示されます。UPPER()
を使用するよりも、COLLATE
を使用する方が、このテストスクリプト(PasteBin)。問題もあります @@ Ceiscダニーの答え:
一部の言語では、変換は往復しません。つまり、LOWER(x)!= LOWER(UPPER(x))。
トルコ語の大文字の"İ"一般的な例です。
-
いいえ、少なくともこのコンテキストでは、照合はデータベース全体の設定ではありません。データベースレベルの既定の照合順序があり、
COLLATE
句を指定しない変更され新しく作成された列の既定値として使用されます(この一般的な誤解はどこから来たのでしょう)。文字列リテラルと変数を他の文字列リテラルと変数と比較するか、データベースレベルのメタデータを参照しない限り、クエリに直接影響しません。 -
いいえ、照合はクエリごとではありません。
-
照合順序は、クエリごとではなく、述語ごと(つまり、何らかのオペランド)または式です。これは、
WHERE
句だけでなく、クエリ全体にも当てはまります。これには、JOIN、GROUP BY、ORDER BY、PARTITION BYなどが含まれます。 -
いいえ、次の理由により、
VARBINARY
に変換しません(たとえば、convert(varbinary、myField)= convert(varbinary、 'sOmeVal')
)。- これはバイナリ比較であり、大文字と小文字を区別しません(この質問が求めているものです)
- バイナリ比較が必要な場合は、バイナリ照合を使用します。 SQL Server 2008以降を使用している場合は、
_BIN2
で終わるものを使用します。それ以外の場合は、_BIN
で終わるものを使用する以外に選択肢はありません。データがNVARCHAR
の場合、使用するロケールは関係ありません
大文字と小文字を区別して、そのようなvarbinaryにキャストすることができます:
SELECT * FROM myTable
WHERE convert(varbinary, myField) = convert(varbinary, 'sOmeVal')
どのデータベースを使用していますか? MS SQL Serverでは、データベース全体の設定です。または、COLLATEキーワードを使用して、クエリごとに上書きできます。