2013-06-09 4 views
1

У меня есть процедура и ввод разделяется запятой, например «1,2,3».Как разбить данные, разделенные запятыми

Я хотел бы запросить как

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

Пожалуйста, обратите внимание, что person_id является целым числом.

+0

Тогда нет сомнений, просто не вставляйте строку ввода в пару одинарных кавычек. – Lion

+0

Вы можете использовать что-то вроде [this] (http://stackoverflow.com/a/3097916/1114171), а затем сделать 'IN (SELECT * FROM @xml)' –

+0

Привет Лев, мой код похож. DECLARE @T AS STRING SET @ T = '1,2,3' ВЫБЕРИТЕ * ОТ ЧЕЛОВЕКА, ЧТО PERSON_ID IN (@T). Не могли бы вы помочь изменить это? – user2395176

ответ

1

Я видел этот тип вопроса так часто я отправил блог на него here.

В основном у вас есть три варианта (насколько мне известно)

В версии LIKE, что предложил Гордон 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 ('[email protected]+') ' 

EXEC sp_executesql @sql 
0
SearchList = ',' + inputSearchTerm + ','; /* e.g. inputSearchTerm is '1,2,3' */ 

SELECT * FROM PERSON WHERE CONTAINS(SearchList, ',' + cast(PERSON_ID as varchar) + ','); 
0

Поскольку contains кажется излишним (он предназначен для нечеткого поиска и использует полнотекстовый индекс), потому что charindex() не является стандартом SQL, и я ненавижу ответы, где varchar не имеет длину, позвольте мне дать альтернативу :

SELECT * 
FROM PERSON 
WHERE ','[email protected]+',' like '%,'+cast(PERSON_ID as varchar(255))+',%'; 

конкатенации запятых для @SearchList убеждается, что все значения окружены ограничителями. Затем они помещаются вокруг определенного значения, чтобы предотвратить совпадение 110.

Обратите внимание, что это будет не, особенно эффективным, поскольку для этого потребуется полное сканирование таблицы.

0

Вот способ сделать это с помощью рекурсивного ОТВ:

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 here.

Смежные вопросы