1

我有一个程序,输入用逗号分隔,如“1,2,3”。

我想像这样查询

SELECT * FROM PERSON WHERE PERSON_ID IN(1,2,3). 

请注意,PERSON_ID 是整数。

4

4 回答 4

1

我经常看到这种类型的问题,所以我在这里发布了一个博客。

基本上你有三个选择(据我所知)

LIKEGordon 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
于 2013-06-09T16:36:08.400 回答
0
SearchList = ',' + inputSearchTerm + ',';  /* e.g. inputSearchTerm is '1,2,3' */

SELECT * FROM PERSON WHERE CONTAINS(SearchList, ',' + cast(PERSON_ID as varchar) + ',');
于 2013-06-09T14:55:44.920 回答
0

因为contains看起来有点矫枉过正(它是为模糊搜索而设计的,并使用全文索引),因为charindex()不是标准 SQL,而且我讨厌varchar没有长度的答案,让我给出一个替代方案:

SELECT *
FROM PERSON
WHERE ','+@SearchList+',' like '%,'+cast(PERSON_ID as varchar(255))+',%';

逗号的串联@SearchList确保所有值都被分隔符包围。然后将它们放在特定值周围,以防止1匹配10

请注意,这不会特别有效,因为它需要全表扫描。

于 2013-06-09T15:57:56.150 回答
0

这是一种使用递归 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在这里

于 2013-06-09T17:00:28.190 回答