SQLServerで、WHERE句でデータの絞り込みをする時に、大文字と小文字を区別して検索したい!!!
WHERE句でデータの絞り込みをする際、「=」、「LIKE」、「IN」などでデータを絞り込むと思います。
そこで、普通に記載してしまうと大文字でも小文字でも関係なくデータが検索されてしまい、意図しないデータが抽出されてしまうことがあります。
今回の記事では、「COLLATE Japanese_CS_AS」を使って大文字と小文字を区別して検索する方法について、サンプルコードを使用して解説していきます。
今回使用するテーブルやデータのSQL構文は下記に記載しているので、ご自分の開発環境にコピペして使用してください。
CREATE TABLE user_table
(id int, name varchar(30), address varchar(50))
;
INSERT INTO user_table
(id,name, address)
VALUES
('1','Aoki', 'Aomori'),
('2','Akiyama', 'Akita'),
('3','Iwasaki', 'Iwate'),
('4','Yamada', 'Yamagata'),
('5','Miyauti', 'Miyagi'),
('6','Fukuda', 'Fukushima'),
('7','aoki', 'aomori'),
('8','akiyama', 'akita'),
('9','iwasaki', 'iwate'),
('10','yamada', 'yamagata'),
('11','miyauti', 'miyagi'),
('12','fukuda', 'fukushima')
;
「COLLATE Japanese_CS_AS」について
SQLServerでは、大文字小文字を区別するための演算子に「COLLATE Japanese_CS_AS」を使用します。
「COLLATE Japanese_CS_AS」を検索する文字列の末尾にセットすることで、セットした文字列を大文字小文字を区別して検索することが可能になります。
「COLLATE Japanese_CS_AS」は、SQLServerに準備されている演算子なので、MySQLでは使用することができません。 MySQLでは「BINARY演算子」を使用します。
私は個人開発でMySQLを使用していて、会社ではSQLServerを使用しているため、「BINARY」と「COLLATE Japanese_CS_AS」の使用でエラーになった経験があります。
MySQLを使用している方は、下記の記事を参考にしてみてください。
それでは、「=」、「LIKE」、「IN」それぞれでBINARY演算子を使った例を見ていきましょう。
「=」で「COLLATE Japanese_CS_AS」を使う
「=」でBINARY演算子を使うには、検索する文字列の末尾に「COLLATE Japanese_CS_AS」と記載することで、大文字小文字を区別して検索することが可能です。
まずは、BINARYを指定せず実行してみます。
【クエリ】
SELECT
*
FROM
user_table
WHERE
address = 'Fukushima'
;
【実行結果】
id | name | address |
---|---|---|
6 | Fukuda | Fukushima |
12 | fukuda | fukushima |
大文字を含めて文字列をセットしても、実行結果には大文字小文字関係なくデータが抽出されます。 それでは、「COLLATE Japanese_CS_AS」を指定して実行します。
【クエリ】
SELECT
*
FROM
user_table
WHERE
address = 'Fukushima' COLLATE Japanese_CS_AS
;
【実行結果】
id | name | address |
---|---|---|
6 | Fukuda | Fukushima |
大文字を含むデータのみが抽出されました。
「LIKE」で「COLLATE Japanese_CS_AS」を使う
LIKE演算子でも「=」と同様に検索文字列の末尾に指定することで、検索可能です。
まずは、「COLLATE Japanese_CS_AS」を指定しない例です。
【クエリ】
SELECT
*
FROM
user_table
WHERE
address LIKE 'A%'
;
【実行結果】
id | name | address |
---|---|---|
1 | Aoki | Aomori |
2 | Akiyama | Akita |
7 | aoki | aomori |
8 | akiyama | akita |
先頭に大文字の「A」があるものを抽出したかったのですが、小文字のものも含まれてしまっています。
それでは、「COLLATE Japanese_CS_AS」を指定してみます。
【クエリ】
SELECT
*
FROM
user_table
WHERE
address LIKE 'A%' COLLATE Japanese_CS_AS
;
【実行結果】
id | name | address |
---|---|---|
1 | Aoki | Aomori |
2 | Akiyama | Akita |
先頭が大文字の「A」のデータのみが抽出されました。
「IN」で「COLLATE Japanese_CS_AS」を使う
IN演算子でも基本は同じですが、書き方を間違えてしまうとエラーになります。
エラーになる例が下記の通りです。
【クエリ】
SELECT
*
FROM
user_table
WHERE
address IN ('Yamagata','iwate') COLLATE Japanese_CS_AS
;
【実行結果】
エラー
「COLLATE Japanese_CS_AS」を記載する位置がおかしいためエラーになってしまっています。
正しくは、下記の通りです。
【クエリ】
SELECT
*
FROM
user_table
WHERE
address IN ('Yamagata' COLLATE Japanese_CS_AS, 'iwate' COLLATE Japanese_CS_AS)
;
【実行結果】
id | name | address |
---|---|---|
4 | Yamada | Yamagata |
9 | iwasaki | iwate |
「COLLATE Japanese_CS_AS」をそれぞれの検索文字列の末尾にセットすることでエラーを解消することができます。
また、INの場合は、検索文字列ごとに大文字小文字の区別をするかどうかも指定することが可能です。
【クエリ】
SELECT
*
FROM
user_table
WHERE
address IN ('Yamagata' COLLATE Japanese_CS_AS, 'iwate')
;
【実行結果】
id | name | address |
---|---|---|
3 | Iwasaki | Iwate |
4 | Yamada | Yamagata |
9 | iwasaki | iwate |
‘Yamadata’では大文字小文字を指定して、’iwate’では指定なしにしましたので、期待通りの実行結果になりました。
まとめ
- COLLATE Japanese_CS_ASは、大文字小文字を区別するための演算子
- 「COLLATE Japanese_CS_AS」は、SQLServerで使用される演算子
- 検索文字列の末尾に「「COLLATE Japanese_CS_AS」」を記載して使用する
- IN演算子で使用する場合には、「()括弧」の中の検索文字列の後に記載する