Select 当 IN 中没有可用记录时,所有记录都使用 IN 子句
Select All records using IN Clause when no records available inside IN
我正在尝试根据逗号分隔值查询 table。如果存在值,我需要使用。如果它是空的,我需要 select all
DECLARE @UserIdList VARCHAR(500) = '150, 112' // Not working when its ''
DECLARE @Users TABLE (UserId INT);
WITH UserCSVtoTable AS
(
SELECT
CAST('<XMLRoot><RowData>' + REPLACE(t.val, ',', '</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
FROM
(SELECT @UserIdList) AS t(val)
)
INSERT INTO @Users (UserId)
SELECT m.n.value('.[1]', 'varchar(8000)') AS UserId
FROM UserCSVtoTable
CROSS APPLY x.nodes('/XMLRoot/RowData') m(n)
查询
SELECT UserId, Email
FROM Users
WHERE UserId IN (SELECT UserId FROM @Users)
它仅在我发送值时起作用。如果我发送 '' 它不会记录所有记录。
当@Users
列表中没有可用记录时,如何获取所有记录?
您可以使用:
SELECT UserId, Email
From Users
Where UserId IN (Select UserId from @Users)
OR NOT EXISTS(SELECT 1 FROM @Users);
假设 UserId
定义为 NOT NULL
那么这两个条件是互斥的。
我正在尝试根据逗号分隔值查询 table。如果存在值,我需要使用。如果它是空的,我需要 select all
DECLARE @UserIdList VARCHAR(500) = '150, 112' // Not working when its ''
DECLARE @Users TABLE (UserId INT);
WITH UserCSVtoTable AS
(
SELECT
CAST('<XMLRoot><RowData>' + REPLACE(t.val, ',', '</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
FROM
(SELECT @UserIdList) AS t(val)
)
INSERT INTO @Users (UserId)
SELECT m.n.value('.[1]', 'varchar(8000)') AS UserId
FROM UserCSVtoTable
CROSS APPLY x.nodes('/XMLRoot/RowData') m(n)
查询
SELECT UserId, Email
FROM Users
WHERE UserId IN (SELECT UserId FROM @Users)
它仅在我发送值时起作用。如果我发送 '' 它不会记录所有记录。
当@Users
列表中没有可用记录时,如何获取所有记录?
您可以使用:
SELECT UserId, Email
From Users
Where UserId IN (Select UserId from @Users)
OR NOT EXISTS(SELECT 1 FROM @Users);
假设 UserId
定义为 NOT NULL
那么这两个条件是互斥的。