2014-02-12 158 views
0

我有一個下表SQL查詢 - 處理空值

Name Amount Paid 
----------------------- 
Ali  500 500 
Baba  700 100 
Cam  300 Null 
Dave  Null Null 

我想下面的期望的結果:

Name Amount Paid 
-------------------- 
Baba  700 100 
Cam  300 Null 

我寫了下面的SQL查詢,但沒有奏效

SELECT Name, Amount, Paid 
FROM Table_1 
WHERE PAID <> AMOUNT 
+0

你得到了什麼?錯誤或某些結果與預期的不同? –

回答

1

將它的工作,如果你把NULL爲零(假設這是有效的業務邏輯)

SELECT Name, ISNULL(Amount,0), ISNULL(Paid,0) as Paid 
FROM Table_1 
WHERE ISNULL(Paid,0) <> ISNULL(Amount,0) 
+0

當「Paid」爲零且「Amount」爲NULL或反之時,這將產生無效結果。 – dasblinkenlight

+0

@dasblinkenlight因此我的開場白線詢問NULL是否可以視爲零,已澄清了我的答案的開場白,以使其更加清晰。 – Tanner

1

那麼,null <> nullnullnull = null也是null,導致錯誤的情況。混亂?

你必須單獨檢查空,使用is null操作:

select 
Name, Amount, Paid 
from Table_1 
where 
(Paid is not null and Amount is not null and Paid <> Amount) 
or 
not (Paid is null and Amount is null); 

或者,在某些情況下,您可以輕鬆地使用

coalesce(Paid, 0) <> coalesce(Amount, 0) 
+1

錯! 'null <> null'的結果不是false,它是null –

+0

@JakubKania它是where子句中的一個錯誤條件。 MS SQL沒有真或假。 – Luaan

+0

但它仍然是空的不是假的。如果你將它用作其他類似'NOT NULL <> null'的部分,你仍然會得到空值。 where條款不是真的,我們可以達成一致。 –

1

嘗試這種情況:

SELECT Name, Amount, Paid 
FROM  Table_1 
WHERE ISNULL(PAID,0) <> ISNULL(AMOUNT,0) 
+0

當「Paid」爲零且「Amount」爲「NULL」時,這會產生無效結果,反之亦然。 – dasblinkenlight

+0

你是對的,我認爲他永遠不會插入0/null組合。感謝您的認同。 – JiggsJedi

1

SELECT姓名,金額,ISNULL(付費,0)作爲付費 FROM TABLE_1
WHERE ISNULL(付費,0)<> AMOUNT

+0

當「Paid」爲NULL且「Amount」不是「NULL」時,這將產生無效結果。 – dasblinkenlight

1

NULL表示未知的,所以dmbs不能說300 <> NULL。使用合併(COL,0)時,NULL意味着零:

SELECT Name, Amount, Paid 
FROM Table_1 
WHERE COALESCE(PAID,0) <> COALESCE(AMOUNT,0) 
+0

當「Paid」爲零且「Amount」爲「NULL」時,這將產生無效結果,或反之。 – dasblinkenlight

+0

看起來,NULL表示沒有任何付款或沒有任何付款。等於零。所以結果會顯示所有超支或欠支付的記錄。 –

+0

如果'NULL'和零是相同的,則表可以更改爲禁止'NULL'。首先允許「NULL」的主要意思是說「我們不知道」。假設問題的作者在這個問題上做出了正確的決定,那麼將NULL視爲零將是不正確的。當然,決定這是對還是錯的唯一人將是桌子的設計者。 – dasblinkenlight