是否可以在 tsql 中迭代数字列表?



我有一个以逗号分隔的 personID 列表:1265, 8632. 我想做的是我想用一大块伪代码来指示的东西,当然,这是行不通的。

declare @max int = (select count(*) from dbo.tablePersons)-1
declare @cnt = 0
BEGIN
SELECT personID FROM dbo.tablePersons 
WHERE (1265, 8632)[@cnt] 
IS NOT IN SELECT personID FROM  dbo.tablePersons
SET @cnt = @cnt + 1
END

我想1265, 8632遍历列表并检查列表中的 ID 是否SELECT personID FROM dbo.tablePersons中不存在。目标是在我的列表中找到所有那些 ID 在SELECT personID FROM dbo.tablePersons.

鉴于此伪代码不可行的事实 - 有没有一种解决方法?

你可以试试这个:

DECLARE @mockperson TABLE(ID INT, PersName VARCHAR(100));
INSERT INTO @mockperson VALUES
(1,'pers 1')
,(2,'pers 2');
DECLARE @yourlist VARCHAR(100)='1,999,2';

--查询拆分给定列表并检查 person 表中NOT IN的数字

WITH Casted AS
(
SELECT CAST('<x>' + REPLACE(@yourlist,',','</x><x>') + '</x>' AS XML) AS TheListAsXml
)
SELECT x.value('text()[1]','int')
FROM Casted
CROSS APPLY TheListAsXml.nodes('/x') AS A(x)
WHERE x.value('text()[1]','int') NOT IN(SELECT ID FROM @mockperson);

从 v2016 开始

使用STRING_SPLIT()(v2016+(,这将是相同的方法,只是更容易

SELECT *
FROM STRING_SPLIT(@yourlist,',') AS A
WHERE A.value NOT IN(SELECT ID FROM @mockperson);

最新更新