SQL HELP - 基于 BIT 变量的条件 where 子句 - SQL Server
Posted
技术标签:
【中文标题】SQL HELP - 基于 BIT 变量的条件 where 子句 - SQL Server【英文标题】:SQL HELP - Conditional where clause based on a BIT variable - SQL Server 【发布时间】:2009-03-09 16:02:36 【问题描述】:我需要帮助来编写条件 where 子句。这是我的情况:
我有一个位值来确定在选择语句中返回哪些行。如果值为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)
谢谢。
【问题讨论】:
【参考方案1】:将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
是什么导致了两个完全否定对方的子句
【讨论】:
【参考方案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)
^^^
【讨论】:
【参考方案3】:您的查询需要一个 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
【讨论】:
感谢您的建议,但我给出的查询只是一个示例,它要复杂得多,所以目前这样拆分它们是不可行的。跨度> 更复杂 -> 更有理由将其分解为正确数量的查询。 ***.com/questions/266697/…以上是关于SQL HELP - 基于 BIT 变量的条件 where 子句 - SQL Server的主要内容,如果未能解决你的问题,请参考以下文章
基于过程输入变量的条件 Where 子句 Oracle SQL