2013-08-20 23 views
1

是否有可能對同一列使用兩次ISNULL?ISNULL兩次用於同一列

ISNULL(ISNULL(column, SELECT sum(column2) FROM table WHERE type = '1')), SELECT sum(column2) FROM table WHERE type = '2')) 

或者我應該以不同的方式使用IF ELSE來做這件事嗎?那看起來怎麼樣?

+0

@JoachimIsaksson對不起,似乎一個不同的RDBMS – user4035

+0

@ user4035看起來像SQL Server的'ISNULL()',但我想它可能存在也在其他數據庫中。 –

+0

@JoachimIsaksson是的,它是SQL Server。在MySQL中,相應的運算符稱爲IFNULL – user4035

回答

2

看看coalesce operator。您的查詢變爲:

COALESCE(column, 
    (SELECT sum(column2) FROM table WHERE type = '1'), 
    (SELECT sum(column2) FROM table WHERE type = '2')) 

它從其參數中返回第一個非空結果。

+0

在我的情況下,如果值爲空,我只想獲得非空值。藉助COALESCE,它將從其論點中返回第一個非價值。我誤解了COALESCE,還是可以這樣寫:如果原始值爲空,它只會從參數中獲取第一個非空值? – mediasurface

+0

「是否可以這樣寫:只有當原始值爲空時,它纔會從參數中獲取第一個非空值?」如果原始值爲空,它將從其參數中獲取第一個非空值。如果原始值不爲空,則返回原始值。我不確定我瞭解你的問題。 – Amy

0

嘗試使用COALESCE(如果您使用的是SQL Server)。 http://msdn.microsoft.com/en-us/library/ms190349.aspx

它會爲您提供值列表中的第一個非空值。你還需要更多幫助來構建SQL嗎?

+0

在我的情況下,如果值爲空,我只想獲得一個非空值。藉助COALESCE,它將從其論點中返回第一個非價值。我誤解了COALESCE,還是可以這樣寫:如果原始值爲空,它只會從參數中獲取第一個非空值? – mediasurface

+0

您正在閱讀COALESCE。如果您需要確保只返回結果不爲null的行,則可以通過檢查(Value1 IS NOT NULL或Value2 IS NOT NULL OR等)來處理WHERE子句中的行。這將確保您的結果僅包含將生成非空值的行。但是......您也可以將您在另一個查詢中寫入的查詢(使其成爲子查詢)並指定您只想要返回COALESCE的結果不爲null的行。如果這沒有意義,我可以更多地解釋這一點。 –

1

是的,這是可能的。

(我在這個問題表達看到的問題是不平衡的括號;兩個額外的收盤括號)

ISNULL函數有兩個參數。這兩個參數中的任何一個(或兩個)都可以是表達式,而ISNULL函數是一個表達式。所以是的,你可以根據需要將ISNULL函數嵌入兩層,三層,四層或更多層。

返回包含單個列的單個行的SELECT語句可以(通常)用作表達式。並且查詢中的多個SELECT語句(子查詢)可以引用相同的表和相同的列。

在許多情況下,當我們看到這種類型的查詢時,它指向的模型運行不正常,或者指向尋找獲得等效結果的不同方式。

編輯

至於其他的答案已經指出的那樣,更便攜,ANSI標準兼容COALESCE功能可用於返回同樣的結果。

這三個表達式是等效的:

ISNULL(ISNULL(a,b),c) 
ISNULL(a,ISNULL(b,c)) 
COALESCE(a,b,c) 

其也等同於這些(不必要的冗餘)的表達式:

COALESCE(COALESCE(a,b),c) 
COALESCE(a,(COALESCE(b,c)) 

測試用例:

create table tst (id int, a int, b int, c int); 
insert into tst values 
(1,NULL,NULL,NULL) 
,(2,21,NULL,NULL) 
,(3,NULL,32,NULL) 
,(4,NULL,NULL,43) 
,(5,51,52,NULL) 
,(6,61,NULL,63) 
,(7,NULL,72,73) 
,(8,81,82,83); 

-- SQL Server 
SELECT ISNULL(ISNULL(a,b),c) AS t1 
    , ISNULL(a,ISNULL(b,c)) AS t2 
    , COALESCE(a,b,c)  AS t3 
    FROM tst 
ORDER BY id 

-- MySQL 
SELECT IFNULL(IFNULL(a,b),c) AS t1 
    , IFNULL(a,IFNULL(b,c)) AS t2 
    , COALESCE(a,b,c)  AS t3 
    FROM tst 
ORDER BY id 

-- Oracle 
SELECT NVL(NVL(a,b),c)  AS t1 
    , NVL(a,NVL(b,c))  AS t2 
    , COALESCE(a,b,c)  AS t3 
    FROM tst 
ORDER BY id 
+0

你是否推薦使用ISNULL這種方式,或者你的意思是根據你的經驗,這往往不能很好地工作? – mediasurface

+0

@mediasurface:我認爲你可以使用ISNULL。問題中的表達式很好(除了不匹配的parens之外),只要它返回所需的結果集即可。正如其他答案所指出的那樣,您可以使用更便攜的符合ANSI標準的'COALESCE'功能完成相同的結果。 – spencer7593