LIKE演算子に関するドキュメント では、大文字と小文字の区別については何も伝えられていません。それは...ですか?有効/無効にする方法は?
必要であれば、Microsoft SQL Server 2005インストールでvarchar(n)
列を照会しています。
大文字と小文字を区別するのは演算子ではなく、列そのものです。
SQL Serverのインストールが実行されると、インスタンスに対してデフォルトの照合が選択されます。別の方法で明示的に言及されていない限り(以下のcollate句を確認してください)、新しいデータベースが作成されると、インスタンスから照合を継承し、新しい列が作成されると、所属するデータベースから照合を継承します。
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
照合に関するこのすべての話は、少し複雑に思えます。次のようなものだけを使用しないのはなぜですか。
IF UPPER(@@VERSION) NOT LIKE '%Azure%'
その後、照合は大文字と小文字を区別しません
テーブルを定義するときに、照合順序照合順序を定義するオプションがあります。大文字と小文字を区別する順序を定義すると、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
を使用した検索での照合順序の結果を示しています。
列/データベース/サーバーの照合順序を変更せずに大文字と小文字を区別した検索を実現したい場合は、常に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;
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」は、大文字と小文字を区別する世界では一致しません。
つまり、照合なしとデフォルトの照合の使用には違いがあります。一方に照合がない場合、他方から明示的な照合が「割り当て」られます。
(明示的な照合が左側にある場合、結果は同じです。)
走ってみて、
SELECT SERVERPROPERTY('COLLATION')
次に、照合で大文字と小文字が区別されるかどうかを調べます。
Microsoft SQL Server Management Studioで照合順序を簡単に変更できます。