2009-06-26 64 views
4

簡單的查詢,可能是不可能的,但我知道有一些聰明的人在那裏:)SQL查詢 - 真=>真,假=> true或false

鑑於布爾參數,我想定義我的where子句要麼限制某一列的輸出 - 要麼什麼也不做。

所以,給定參數@bit = 1,這將是結果:

其中柱= 1

給定參數@bit = 0,這將是結果:

其中列= 1或0

即沒有任何效果/顯示所有結果(列是位字段)

我不想動態SQL - 我能滿足於這種固定代碼,但我只是想知道是否有一些聰明的魔法會使上面的整潔和簡單。

有嗎?我正在使用SQL Server。

歡呼:d

回答

7

答案column = 1 or @bit = 0作品列只能是0或1。如果列可以是任何價值,你想:column = 1 or @bit = 0 and column = 0

+0

嗯,這麼簡單!謝謝:D – 2009-06-26 16:29:32

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

  • 如果3210件
+0

假設「列」只能是0或1,這是準確的 - 但肯定使用`UNION ALL`效率較低。第一個在優化器中減少爲WHERE column = 1或根本沒有where子句(當@bit = 0時)。優化器可能不會捕獲「UNION ALL」(如果是這樣,它不會比第一個更糟糕)。 – 2009-06-26 16:32:58

+0

@Adam Luter:UNION ALL在SQL Server中更高效,因爲任何查詢都將被優化。第一個查詢將始終使用FULL SCAN,即使@bit = 1。 – Quassnoi 2009-06-26 16:36:38

+0

可憐的SQL Server! – 2009-06-29 16:11:00

0
select * 
from MyTable 
where (@bit = 0 OR MyColumn = 1) 
0
select ... 
from [table] 
where @bit = 0 or (column = @bit) 
+0

令人困惑,但正確。 – 2009-06-26 16:24:01

3
where column BETWEEN @bit AND 1 
0

我想出了一個不同的答案,當看到一致的答案時感到啞巴。 所以,只是爲了yucks,比較兩個使用我自己的數據庫。我真的不知道自己是否真的具有可比性,但我的執行計劃,以我的愚蠢的答案給出微弱的優勢:

SELECT *
從MyTable的
其中列<>情況下@bit 1時,然後0,否則, - 1結束

我意識到索引,表格大小等可以影響這一點。
此外,意識到你可能無法比較一個-1 ...
只是想我會分享。

0

試試這個

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

這部作品無論列的數據類型是什麼(甚至可以是一個字符串,例如)。如果它是,當然,這將是一個不同的缺省值(不爲0)

0

WHERE柱> = @bit

然而,這隻能用於> 0的值在數字列。由於數據類型的優先級,@bit將被隱式轉換爲int,smallint等。

相關問題