【问题标题】:Is it possible to iterate over a list of numbers in tsql?是否可以遍历 sql 中的数字列表?
【发布时间】:2018-11-22 17:14:54
【问题描述】:

我有一个以逗号分隔的 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。

鉴于此伪代码不可行 - 是否有一种解决方法?

【问题讨论】:

  • 尽可能避免循环或光标。 SQL Server 经过优化,可以在一组基础上执行操作,而不是 1 对 1。

标签: sql-server list tsql iteration


【解决方案1】:

你可以试试这个:

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 INperson 表

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);

【讨论】:

    猜你喜欢
    • 2015-03-10
    • 2019-11-24
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多