我需要帮助编写条件where子句。这是我的情况:
我有一个位值,用于确定select语句中要返回的行数。如果值为true,我需要返回import_id列不为null的行,如果为false,则我需要import_id列为null的行。
我尝试这样的查询(下面)似乎不起作用,实现这一目标的最佳方法是什么?
DECLARE @imported BIT
SELECT id, import_id, name FROM Foo WHERE
(@imported = 1 AND import_id IS NOT NULL)
AND (@imported = 0 AND import_is IS NULL)
感谢。
答案 0 :(得分:15)
将AND
更改为OR
DECLARE @imported BIT
SELECT id, import_id, name FROM Foo WHERE
(@imported = 1 AND import_id IS NOT NULL)
OR (@imported = 0 AND import_is IS NULL)
你基本上写了
@imported = 1
AND import_id IS NOT NULL
AND @imported = 0
AND import_is IS NULL
相当于
@imported = 1 AND @imported = 0
AND import_id IS NOT NULL AND import_is IS NULL
是什么导致两对条款完全否定对方
答案 1 :(得分:2)
我认为你的意思是
SELECT id, import_id, name FROM Foo WHERE
(@imported = 1 AND import_id IS NOT NULL)
OR (@imported = 0 AND import_is IS NULL)
^^^
答案 2 :(得分:1)
您的查询需要在不同过滤器之间进行OR选择。 如果在这种情况下使用单独的查询,那么优化器会更好。是的,代码冗余很糟糕,但对于优化器来说,这些查询完全不同(而不是冗余)。
DECLARE @imported BIT
IF @imported = 1
SELECT id, import_id, name
FROM Foo
WHERE import_id IS NOT NULL
ELSE
SELECT id, import_id, name
FROM Foo
WHERE import_id IS NULL