4

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

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

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

其中列 = 1

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

其中列 = 1 或 0

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

我不想要动态 sql - 我可以解决在代码中解决这个问题,但我只是想知道是否有一些聪明的魔法可以使上述内容变得整洁和简单。

在那儿?我正在使用 sql 服务器。

欢呼:D

4

8 回答 8

8

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

于 2009-06-26T16:22:35.877 回答
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

于 2009-06-26T16:20:50.663 回答
3
where column BETWEEN @bit AND 1
于 2009-06-26T16:29:32.413 回答
0
select *
from   MyTable
where (@bit = 0 OR MyColumn = 1)
于 2009-06-26T16:21:24.177 回答
0
select ...
from [table]
where @bit = 0 or (column = @bit)
于 2009-06-26T16:21:50.227 回答
0

WHERE 列 >= @bit

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

于 2009-06-26T17:18:39.323 回答
0

我想出了一个不同的答案,当看到一致的答案时,我感到很愚蠢。所以,只是为了恶心,使用我自己的数据库比较了两者。我真的不知道它们是否真的具有可比性,但我的执行计划对我愚蠢的回答有一点优势:

select *
from MyTable
where column <> case @bit when 1 then 0 else -1 end

我意识到索引、表格大小等会影响这一点。
此外,意识到你可能无法与 -1 相比......
只是想我会分享。

于 2009-06-26T16:40:15.897 回答
0

尝试这个

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

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

于 2009-06-26T16:44:30.797 回答