我对整个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
答案 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;
这绝对不是最有效的方法,但它可能是最简单的实现。