小物SEのメモ帳

IT関係の試したことや調べたことの備忘録

【SQL Server】WHERE句で正規表現的な検索をする

検索をする際に、SQLServerでは正規表現を使うことはできません。
使い勝手は正規表現ほどではありませんが、似たようなものがありますので検証してみました。

まずは、テーブルを作成します。

CREATE TABLE TEXT_TEST (
	[id] INT,
	[text] NVARCHAR(255)
)


今回検証に使うテストデータは以下となります。

INSERT INTO TEXT_TEST VALUES 
(1, N'123'),
(2, N'abc'),
(3, N'aBc'),
(4, N'a c'),
(5, N'A C'),
(6, N'123'),
(7, N'漢字a')
(8, N'1bc')


照合順序に左右されたくないため、ここではCOLLATE句でJapanese_BIN2を指定しています。

半角英数字以外を含むレコードを抽出

SELECT * FROM TEXT_TEST
	WHERE [text] LIKE '%[^-a-zA-Z0-9 ]%'
	COLLATE Japanese_BIN2

f:id:utiowa:20170309013017p:plain

半角英数字カナを含む(半角記号除く)レコードを抽出

SELECT * FROM TEXT_TEST
	WHERE [text] LIKE '%[a-zA-Z0-9ア-ン ]%'
	COLLATE Japanese_BIN2

f:id:utiowa:20170309013026p:plain

数字を含むレコードを抽出

SELECT * FROM TEXT_TEST
	WHERE [text] LIKE '%[0-9]%'
	COLLATE Japanese_BIN2

f:id:utiowa:20170309013032p:plain


尚、照合順序についてはJapanese_CS_AS_KS_WSなどがありますが、意味としては以下のような形になります。

CS 大文字、小文字を区別する
CI 大文字、小文字を区別しない
AS アクセントを区別する
AI アクセントを区別しない
KS ひらがな、カタカナを区別する
KI ひらがな、カタカナを区別しない
WS 全角、半角を区別する
WI 全角、半角を区別しない
BIN2 バイナリで区別する


細かい指定や繰り返しの表現は出来ませんが、無いよりはマシですので頭の片隅に入れておくと役立つかも知れません。

【参考】
・パターン
https://technet.microsoft.com/ja-jp/library/ms187489(v=sql.105).aspx
・照合順序
https://msdn.microsoft.com/ja-jp/library/ms143726.aspx
https://blogs.msdn.microsoft.com/jpsql/2016/07/26/1-3/


2017/04/30 以下追記

半角文字(記号含む)を含むレコードを抽出

SELECT *
  FROM [dbo].[TEXT_TEST]
  WHERE [text] LIKE '%[ -~。-゚]%'
  COLLATE Japanese_BIN2

全角文字を含むレコードを抽出

SELECT *
  FROM [dbo].[TEXT_TEST]
  WHERE [text] LIKE '%[^ -~。-゚]%'
  COLLATE Japanese_BIN2