在 SQL 查询中,NOT IN
子句用于过滤出不在指定列表中的行。与 IN
子句相反,NOT IN
子句返回不匹配列表中任何值的行。
例如,假设有一个名为 products
的表,其中包含 product_id
和 product_name
列。以下查询将返回 product_id
不在列表 [1, 2, 3]
中的所有行:
SELECT * FROM products
WHERE product_id NOT IN (1, 2, 3);
在处理 NULL
值时,NOT IN
子句可能会导致意外的结果。当 NULL
值与任何其他值进行比较时,结果都是 NULL
,而不是 TRUE
或 FALSE
。因此,在使用 NOT IN
子句时,如果其中一个列表值为 NULL
,则整个条件将被视为 NULL
,而不是 TRUE
或 FALSE
。
例如,以下查询将返回 product_id
不等于 1
或 NULL
的所有行:
SELECT * FROM products
WHERE product_id NOT IN (1, NULL);
为了避免这种情况,可以使用 NOT IN
子句的替代方法,即使用 NOT EXISTS
子句。以下查询将返回与上面的示例相同的结果,但可以更好地处理 NULL
值:
SELECT * FROM products
WHERE NOT EXISTS (
SELECT 1 FROM (VALUES (1), (NULL)) AS x(value)
WHERE product_id = x.value
);
总之,NOT IN
子句是一种过滤数据的有效方法,但在处理 NULL
值时需要注意。使用 NOT EXISTS
子句可以避免这些问题。
领取专属 10元无门槛券
手把手带您无忧上云