简单查询,可能不可能,但我知道那里有一些聪明人:)
给定一个布尔参数,我希望定义我的where子句来限制某个列的输出 - 或者什么也不做。
因此,给定参数@bit = 1,这将是结果:
其中column = 1
给定参数@bit = 0这将是结果:
其中column = 1或0
即。没有效果/显示所有结果(列是位字段)
我不想要动态的SQL - 我可以解决在代码中解决此问题,但我只是想知道是否有一些聪明的魔法可以使上述简洁明了。
有吗?我正在使用sql server。
欢呼:D答案 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等。