手順があり、入力は「1,2,3」のようにカンマで区切られています。
のようにクエリしたい
SELECT * FROM PERSON WHERE PERSON_ID IN(1,2,3).
PERSON_ID は整数であることに注意してください。
手順があり、入力は「1,2,3」のようにカンマで区切られています。
のようにクエリしたい
SELECT * FROM PERSON WHERE PERSON_ID IN(1,2,3).
PERSON_ID は整数であることに注意してください。
この種の質問をよく目にするので、ここにブログを投稿しました。
基本的には3つのオプションがあります(私の知る限り)
LIKE
ゴードン・リンドフが提案したバージョン。
そのように分割機能を使用します。
DECLARE @InList varchar(100)
SET @InList = '1,2,3,4'
SELECT MyTable.*
FROM MyTable
JOIN DelimitedSplit8K (@InList,',') SplitString
ON MyTable.Id = SplitString.Item
または動的 SQL を使用します。
DECLARE @InList varchar(100)
SET @InList = '1,2,3,4'
DECLARE @sql nvarchar(1000)
SET @sql = 'SELECT * ' +
'FROM MyTable ' +
'WHERE Id IN ('+@InList+') '
EXEC sp_executesql @sql
やり過ぎのようにcontains
思えます (あいまい検索用に設計されており、全文インデックスを使用します)。は標準 SQL ではなく、長さのないcharindex()
回答は嫌いです。別の方法を示します。varchar
SELECT *
FROM PERSON
WHERE ','+@SearchList+',' like '%,'+cast(PERSON_ID as varchar(255))+',%';
コンマを連結@SearchList
すると、すべての値が区切り記号で囲まれます。これらは特定の値の前後に置かれ、1
一致しないようにし10
ます。
全表スキャンが必要になるため、これは特に効率的ではないことに注意してください。
再帰的な CTE を使用してそれを行う方法を次に示します。
declare @SearchList varchar(20)
set @SearchList= '1,2,3'
;with cte as
(select case charindex(',',@SearchList)
when 0 then cast(@SearchList as int)
else cast(left(@SearchList,charindex(',',@SearchList)-1) as int)
end searchVal,
case charindex(',',@SearchList)
when 0 then ''
else right(@SearchList,
len(@SearchList)-charindex(',',@SearchList) )
end remainStr
union all
select case charindex(',',remainStr)
when 0 then cast(remainStr as int)
else cast(left(remainStr,charindex(',',remainStr)-1) as int)
end searchVal,
case charindex(',',remainStr)
when 0 then ''
else right(remainStr,
len(remainStr)-charindex(',',remainStr) )
end remainStr
from cte
where remainStr > ''
)
select p.*
from cte
join person p on cte.searchVal = p.person_id
ここでSQLFiddle 。
SearchList = ',' + inputSearchTerm + ','; /* e.g. inputSearchTerm is '1,2,3' */
SELECT * FROM PERSON WHERE CONTAINS(SearchList, ',' + cast(PERSON_ID as varchar) + ',');