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

SQL根据条件执行不同的语句

MySQL 列,可选择的数据类型(通过sql命令查看:`help create table;`)

将值设置为变量并根据条件SQL进行修改

scala scala 条件控制 和异常处理

在 SQL Server 中将 Bool 转换为 Bit