web-dev-qa-db-ja.com

LIKE演算子はMSSQL Serverで大文字と小文字を区別しますか?

LIKE演算子に関するドキュメント では、大文字と小文字の区別については何も伝えられていません。それは...ですか?有効/無効にする方法は?

必要であれば、Microsoft SQL Server 2005インストールでvarchar(n)列を照会しています。

85
Marcel

大文字と小文字を区別するのは演算子ではなく、列そのものです。

SQL Serverのインストールが実行されると、インスタンスに対してデフォルトの照合が選択されます。別の方法で明示的に言及されていない限り(以下のcollat​​e句を確認してください)、新しいデータベースが作成されると、インスタンスから照合を継承し、新しい列が作成されると、所属するデータベースから照合を継承します。

sql_latin1_general_cp1_ci_asのような照合は、列のコンテンツをどのように処理するかを指示します。 CIは大文字と小文字を区別せず、ASはアクセントを区別します。

照合の完全なリストは https://msdn.Microsoft.com/en-us/library/ms144250(v = sql.105).aspx で入手できます。

(a)インスタンスの照合を確認するには

select serverproperty('collation')

(b)データベースの照合を確認するには

select databasepropertyex('databasename', 'collation') sqlcollation

(c)異なる照合を使用してデータベースを作成するには

create database exampledatabase
collate sql_latin1_general_cp1_cs_as 

(d)異なる照合を使用して列を作成するには

create table exampletable (
    examplecolumn varchar(10) collate sql_latin1_general_cp1_ci_as null
)

(e)列照合を変更するには

alter table exampletable
alter column examplecolumn varchar(10) collate sql_latin1_general_cp1_ci_as null

インスタンスとデータベースの照合順序を変更することは可能ですが、以前に作成されたオブジェクトには影響しません。

文字列の比較のためにその場で列の照合順序を変更することもできますが、これは非常にコストがかかるため、実稼働環境ではあまりお勧めできません。

select
  column1 collate sql_latin1_general_cp1_ci_as as column1
from table1
87
lolol

照合に関するこのすべての話は、少し複雑に思えます。次のようなものだけを使用しないのはなぜですか。

IF UPPER(@@VERSION) NOT LIKE '%Azure%'

その後、照合は大文字と小文字を区別しません

15
Phil R

テーブルを定義するときに、照合順序照合順序を定義するオプションがあります。大文字と小文字を区別する順序を定義すると、LIKE演算子は大文字と小文字を区別して動作します。大文字と小文字を区別しない照合順序を定義すると、LIKE演算子も大文字と小文字を無視します。

CREATE TABLE Test (
    CI_Str VARCHAR(15) COLLATE Latin1_General_CI_AS -- Case-insensitive
,   CS_Str VARCHAR(15) COLLATE Latin1_General_CS_AS -- Case-sensitive
);

sqlfiddleのクイックデモ は、LIKEを使用した検索での照合順序の結果を示しています。

14
dasblinkenlight

列/データベース/サーバーの照合順序を変更せずに大文字と小文字を区別した検索を実現したい場合は、常にCOLLATE句を使用できます。

USE tempdb;
GO
CREATE TABLE dbo.foo(bar VARCHAR(32) COLLATE Latin1_General_CS_AS);
GO
INSERT dbo.foo VALUES('John'),('john');
GO
SELECT bar FROM dbo.foo 
  WHERE bar LIKE 'j%';
-- 1 row

SELECT bar FROM dbo.foo 
  WHERE bar COLLATE Latin1_General_CI_AS LIKE 'j%';
-- 2 rows

GO    
DROP TABLE dbo.foo;

列/データベース/サーバーで大文字と小文字が区別され、大文字と小文字を区別する検索が必要ない場合は、他の方法でも機能します。

USE tempdb;
GO
CREATE TABLE dbo.foo(bar VARCHAR(32) COLLATE Latin1_General_CI_AS);
GO
INSERT dbo.foo VALUES('John'),('john');
GO
SELECT bar FROM dbo.foo 
  WHERE bar LIKE 'j%';
-- 2 rows

SELECT bar FROM dbo.foo 
  WHERE bar COLLATE Latin1_General_CS_AS LIKE 'j%';
-- 1 row

GO
DROP TABLE dbo.foo;
11
Aaron Bertrand

like演算子は2つの文字列を取ります。これらの文字列には、互換性のある照合順序が必要です。照合順序については here で説明します。

私の意見では、事態は複雑になります。次のクエリは、照合に互換性がないことを示すエラーを返します。

select *
from INFORMATION_SCHEMA.TABLES
where 'abc' COLLATE SQL_Latin1_General_CP1_CI_AS like 'ABC' COLLATE SQL_Latin1_General_CP1_CS_AS

ここのランダムマシンでは、デフォルトの照合はSQL_Latin1_General_CP1_CI_ASです。次のクエリは成功しますが、行を返しません。

select *
from INFORMATION_SCHEMA.TABLES
where 'abc' like 'ABC' COLLATE SQL_Latin1_General_CP1_CS_AS

値「abc」と「ABC」は、大文字と小文字を区別する世界では一致しません。

つまり、照合なしとデフォルトの照合の使用には違いがあります。一方に照合がない場合、他方から明示的な照合が「割り当て」られます。

(明示的な照合が左側にある場合、結果は同じです。)

5
Gordon Linoff

走ってみて、

SELECT SERVERPROPERTY('COLLATION')

次に、照合で大文字と小文字が区別されるかどうかを調べます。

3
RandomUs1r

すべてのアイテムのプロパティから変更できます。

case sensitive

1
Daniel Cadena

Microsoft SQL Server Management Studioで照合順序を簡単に変更できます。

  • テーブルを右クリック->デザイン。
  • 列を選択し、列のプロパティを[照合]までスクロールします。
  • [大文字と小文字を区別する]チェックボックスをオンにして、並べ替えの設定を行います