2010-04-23 109 views
0

好吧,所以我試圖從一列保存值3,但只有當沒有包含10或4的行,如果有行包含10或4 I只想顯示那些。SQL選擇語句過濾

什麼將是一個很好的語法來做到這一點?到目前爲止,我一直在嘗試CASE WHEN語句,但我似乎無法弄清楚。

任何幫助將不勝感激。

(我的數據庫是MS SQL 2008服務器)

+0

因此,簡而言之,「如果有10或4的行,然後選擇10或4的行,否則選擇行3」? – BalusC 2010-04-23 17:44:22

+0

你是否想要「量」列的SUM()?,你能否給我們提供幾個基礎的列?即:要分組的ID列(如帳戶或交易等),您需要知道10或4是否適用。 – DRapp 2010-04-23 17:44:38

+0

另外,如果有10個或4個記錄......你想要在查詢中從這種彙總中排除這些數額嗎? – DRapp 2010-04-23 17:47:32

回答

1

根據您的表及其索引的大小,它可能是更有效地計算出你查詢

declare @UseThree as bit = 1; 
if exists (select 1 from testtable where rowval in (10,4)) 
set @UseThree = 0; 

select COUNT(*) 
from testtable 
where (@UseThree = 1 AND rowval=3) 
    OR 
    (@UseThree = 0 AND rowval in (10,4)) 
+0

這是個好主意。謝謝,我現在將執行此操作。 – cc0 2010-04-23 18:02:03

+0

對MrGumbe的感謝能夠確定OP想要什麼! – Leslie 2010-04-23 18:53:36

2

FYI:原單問題的標題是 「SQL CASE WHEN NULL - 問題


CASE WHEN YourColumn IS NULL THEN x ELSE y END 

既然有沒有什麼比較爲NULL並返回true(甚至不是NULL本身),你不能做

CASE YourColumn WHEN NULL THEN x ELSE y END 

只有

CASE ISNULL(YourColumn, '') WHEN '' THEN x ELSE y END 

但你失去NULL和(在這個例子中)空字符串區分的能力。

+0

好的答案,但是誰知道OP的要求是什麼? – 2010-04-23 17:56:16

+0

@KM:是的,這一直是核心問題。 ;-)感謝您的投票! – Tomalak 2010-04-23 18:08:32

4

使用union all

select 
    // columns 
from YourTable 
where YourColumn = 3 and not exists (
    select 1 from YourTable where YourColumn = 10 or YourColumn = 4) 

union all 

select 
    // columns 
from YourTable 
where YourColumn = 10 or YourColumn = 4 
+0

我們錯過了一些東西......即使在你的例子中,你將比較同一列的10或4,而不是3,所以它會暗示表中的多個記錄......除非有其他的基礎,桌子可以裝滿3s,4s和10s,因此總是會自我排除。我認爲BalusC需要澄清他的實際結構和樣本記錄基礎的更多細節。 – DRapp 2010-04-23 18:02:49

+0

@DRapp:實際上,當沒有'10'和'4'時比較'3'。如果他的條件是基於數據的一個子集,那麼將該條件添加到查詢的where子句中會非常簡單。 – 2010-04-23 18:10:41

1

最簡單的解決方案之前,想要的值將在兩個查詢中執行此操作:

SELECT ... FROM YourTable WHERE SomeColumn IN (10,4) 

當且僅當上述查詢產生任何結果,然後運行第二個查詢:

SELECT ... FROM YourTable WHERE SomeColumn = 3 

運行兩個查詢看起來「不雅」,但它的優點:

  • 可以很容易地代碼
  • 這很容易調試
  • 它比一個非常複雜的解決方案往往具有更好的性能
  • 這對於需要維護代碼的程序員來說很容易理解。

運行兩個查詢可能看起來像有額外的開銷,但也認爲你不會每次運行第二個查詢 - 只有當第一個查詢有空結果。如果您使用昂貴的單一查詢解決方案,請記住它每次都會產生費用

+0

你提出了一些好的觀點,但是我覺得在我的情況下這將會是一個笨拙的解決方案,因爲數據庫與網站 – cc0 2010-04-23 18:03:51