[SQL Server] IN 句にパラメータを指定する (ユーザー定義テーブル型)

IN 句をパラメータで指定させたいという要望はたまにあるが、動的に SQL 文を組み立てるくらいしか対処方法がなかった。しかし、SQL Server 2008 から追加された ユーザー定義テーブル型 によって似たような動きをさせることができる。
CREATE TABLE #HOGE
(
 USER_NO INT PRIMARY KEY IDENTITY
 ,NAME VARCHAR(40)
)
INSERT INTO
 #HOGE (NAME)
VALUES
 ('John')
 ,('David')
 ,('Jeffrey')
 ,('Sarrah')
 ,('Mary')

IF TYPE_ID(N'USERLIST') IS NULL
 CREATE TYPE USERLIST AS TABLE
 (
  NUM INT
 )
 GO

-- 削除する場合は以下のように記述。
-- DROP TYPE USERLIST

DECLARE @val AS USERLIST
INSERT INTO
 @val (NUM)
VALUES
 (1)
 ,(3)
SELECT * FROM #HOGE
-- USER_NO フィールドが 1 or 3 のデータを抽出する。
SELECT * FROM #HOGE WHERE USER_NO IN (SELECT NUM FROM @val)
ただ、上記のような要望がある場合は、カンマ区切りの文字列を展開したいという場合が多いだろう。カンマ区切りのデータを展開したいのなら、以下のような関数を定義するといい。

How to split a string according to a delimiter in Ms SQL Server 2008
http://howucando.com/2013/03/21/how-to-split-a-string-according-to-a-delimiter-in-ms-sql-server-2008/

このブログの人気の投稿

Excel で入力した文字に勝手に取り消し線が入る

コピーした行の挿入が表示されない時はフィルタされていないかチェック