1

手順があり、入力は「1,2,3」のようにカンマで区切られています。

のようにクエリしたい

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

PERSON_ID は整数であることに注意してください。

4

4 に答える 4

1

この種の質問をよく目にするので、ここにブログを投稿しました。

基本的には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
于 2013-06-09T16:36:08.400 に答える
0

やり過ぎのようにcontains思えます (あいまい検索用に設計されており、全文インデックスを使用します)。は標準 SQL ではなく、長さのないcharindex()回答は嫌いです。別の方法を示します。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 に答える
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 に答える