SQL HELP - 基于BIT变量的条件where子句 - SQL Server

时间:2009-03-09 16:02:36

标签: sql sql-server tsql

我需要帮助编写条件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)

感谢。

3 个答案:

答案 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