sql query - true => true,false =>对或错

时间:2009-06-26 16:18:18

标签: sql sql-server tsql boolean-logic bit

简单查询,可能不可能,但我知道那里有一些聪明人:)

给定一个布尔参数,我希望定义我的where子句来限制某个列的输出 - 或者什么也不做。

因此,给定参数@bit = 1,这将是结果:

其中column = 1

给定参数@bit = 0这将是结果:

其中column = 1或0

即。没有效果/显示所有结果(列是位字段)

我不想要动态的SQL - 我可以解决在代码中解决此问题,但我只是想知道是否有一些聪明的魔法可以使上述简洁明了。

有吗?我正在使用sql server。

欢呼:D

8 个答案:

答案 0 :(得分:7)

如果列只能是0或1,则答案column = 1 or @bit = 0有效。如果列可能是您想要的任何值:column = 1 or @bit = 0 and column = 0

答案 1 :(得分:4)

SELECT  *
FROM    mytable
WHERE   column = 1 OR @bit = 0

如果您有column1的索引,则此索引会更有效:

SELECT  *
FROM    mytable
WHERE   column = 1 AND @bit = 1
UNION ALL
SELECT  *
FROM    mytable
WHERE   @bit = 0

在我的博客中查看此文章,了解单个WHERE条件与UNION ALL的效果比较:

答案 2 :(得分:3)

where column BETWEEN @bit AND 1

答案 3 :(得分:0)

select *
from   MyTable
where (@bit = 0 OR MyColumn = 1)

答案 4 :(得分:0)

select ...
from [table]
where @bit = 0 or (column = @bit)

答案 5 :(得分:0)

我得出了一个不同的答案,在看到共识答案时感到愚蠢。 所以,只是对于yucks,使用我自己的数据库比较两者。我真的不知道它们是否真的具有可比性,但我的执行计划对我的愚蠢回答略有优势:

选择*
来自MyTable
其中列<> case @bit when 1 then 0 else -1 end

我意识到指数,表格大小等都会影响到这一点 而且,意识到你可能无法比较一下-1 ...
只是想我会分享。

答案 6 :(得分:0)

试试这个

 select ...
 from table
 where column = case when @bit = 0 then 0 else column end

无论列的数据类型是什么(例如,甚至可以是字符串),这都有效。当然,如果它是一个不同的默认值(不是0)

答案 7 :(得分:0)

WHERE列> = @bit

但是,这仅适用于>数字列中的0个值。由于数据类型优先,@ bit将被隐式转换为int,smallint等。