带有空子集的Tsql IN子句

时间:2013-06-19 11:02:06

标签: sql-server tsql dbnull in-subquery

是否可以设置一个也匹配空子集的IN语句?

这是我的疑问:

.. WHERE id IN (SELECT * FROM #subset)

如果#subset为空,我也想要该记录。 解决方法是:

.. WHERE NOT EXISTS(SELECT * FROM #subset) OR id IN (SELECT * FROM #subset)

然而(SELECT * FROM #subset)并不是一个简单的查询,我想知道有一种聪明的方法可以使用“IN”和空子集。

1 个答案:

答案 0 :(得分:3)

使用双阴性表达。

而不是

  

存在匹配

的行

..这是

  

其中不存在与

不匹配的行
DECLARE @m TABLE (KeyCol int, Payload varchar(2));
DECLARE @s TABLE (KeyCol int);

INSERT @m VALUES (1, 'aa'), (2, 'bb'), (3, 'cc');

-- No values in #subset
SELECT
    *
FROM
    @m M
WHERE
    NOT EXISTS (SELECT * FROM @s S WHERE M.KeyCol <> S.KeyCol);

INSERT @s VALUES (2);

-- A matching value in #subset
SELECT
    *
FROM
    @m M
WHERE
    NOT EXISTS (SELECT * FROM @s S WHERE M.KeyCol <> S.KeyCol);

当然,相关的EXISTS WHERE子句可以扩展到多个列(与只需要一列的IN子句不同)