我有一个以逗号分隔的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
中。目标是在列表中找到SELECT personID FROM dbo.tablePersons
中的所有ID。
鉴于这个伪代码不可行 - 这是一种解决方法吗?
答案 0 :(得分:0)
你可以试试这个:
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';
- 查询拆分给定列表并检查数字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);
使用STRING_SPLIT()
(v2016+)这将是相同的方法,只是更容易
SELECT *
FROM STRING_SPLIT(@yourlist,',') AS A
WHERE A.value NOT IN(SELECT ID FROM @mockperson);