1

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

这是我的查询:

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

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

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

但是 ( SELECT * FROM #subset) 并不是一个如此简单的查询,我想知道是否有一种聪明的方法可以将“IN”也用于空子集。

4

1 回答 1

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 子句只需要一列)

于 2013-06-19T11:12:55.683 回答