我有一个程序,输入用逗号分隔,如“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 是整数。
我经常看到这种类型的问题,所以我在这里发布了一个博客。
基本上你有三个选择(据我所知)
LIKE
Gordon Lindoff 建议的版本。
像这样使用拆分功能。
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
SearchList = ',' + inputSearchTerm + ','; /* e.g. inputSearchTerm is '1,2,3' */
SELECT * FROM PERSON WHERE CONTAINS(SearchList, ',' + cast(PERSON_ID as varchar) + ',');
因为contains
看起来有点矫枉过正(它是为模糊搜索而设计的,并使用全文索引),因为charindex()
不是标准 SQL,而且我讨厌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在这里。