如何将逗号分隔为条件数据集?

时间:2018-06-23 19:03:13

标签: sql arrays sql-server

我对整个SQL事物还是很陌生。我有一个帐户ID列表,该列表已从Splunk转换为逗号分隔的字符串,并希望构建一个SQL查询,在其中可以执行和接收该数组中的所有ID。我试过了,但只返回第一个

代码

DECLARE @accountIdlist varchar(8000) = '1e4976b4-c501-42d2-a28c-a89300b24229, 40b74b7c-a32a-4faf-8693-a8e500fc60fc';
SELECT [FirstName]     
      ,[Surname]
      ,[Number]     
      ,[Email]
  FROM customers where accountid IN (@accountIdlist) order by ID desc 

3 个答案:

答案 0 :(得分:2)

您可以尝试使用STRING_SPLIT函数拆分数据,然后在where子句中编写子查询。

  

STRING_SPLIT(字符串,分隔符)

SELECT [FirstName]     
      ,[Surname]
      ,[Number]     
      ,[Email]
FROM customers 
where accountid IN (select value from STRING_SPLIT(@accountIdlist,',')) 
order by ID desc 

我建议您使用exists

SELECT [FirstName]     
      ,[Surname]
      ,[Number]     
      ,[Email]
FROM customers 
where exists (select 1 
              from STRING_SPLIT(@accountIdlist,',')
              where accountid = value
             ) 

sqlfiddle:https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=bdeebda14bc88f303a7c5c5752c36039

编辑

如果您的sql-server版本不支持STRING_SPLIT,则可以自己编写SPLIT

这是给您的样品。

CREATE FUNCTION dbo.Spite_String  (@input varchar(max),@Split char(1))
RETURNS @rtnTable TABLE 
(
    Value varchar(1000)
)
AS
BEGIN
   DECLARE @XmlData xml;

   SELECT @XmlData = CONVERT(xml,'<root><s>' + REPLACE(@input,@Split,'</s><s>') + '</s></root>');

  insert into @rtnTable (Value)
  SELECT [Value] = T.c.value('.','varchar(1000)')
  FROM @XmlData.nodes('/root/s') T(c)
  return
END

然后您可以像

一样使用
SELECT [FirstName]     
      ,[Surname]
      ,[Number]     
      ,[Email]
FROM customers 
where exists (select 1 
              from Spite_String(@accountIdlist,',')
              where accountid = value
             ) 

sqlfiddle:https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=debc6857a970c892f175307e3e840877

答案 1 :(得分:0)

使用SQL函数将varchar列表转换为临时表并加入结果集(see this accepted answer)。

答案 2 :(得分:0)

最简单的方法可能是使用like

SELECT [FirstName], [Surname], [Number], [Email]
FROM customers 
WHERE ', ' + @accountIdList + ', ' LIKE '%, accountid, %' 
ORDER BY ID DESC; 

这绝对不是最有效的方法,但它可能是最简单的实现。