是否有可能對同一列使用兩次ISNULL?ISNULL兩次用於同一列
ISNULL(ISNULL(column, SELECT sum(column2) FROM table WHERE type = '1')), SELECT sum(column2) FROM table WHERE type = '2'))
或者我應該以不同的方式使用IF ELSE來做這件事嗎?那看起來怎麼樣?
是否有可能對同一列使用兩次ISNULL?ISNULL兩次用於同一列
ISNULL(ISNULL(column, SELECT sum(column2) FROM table WHERE type = '1')), SELECT sum(column2) FROM table WHERE type = '2'))
或者我應該以不同的方式使用IF ELSE來做這件事嗎?那看起來怎麼樣?
看看coalesce
operator。您的查詢變爲:
COALESCE(column,
(SELECT sum(column2) FROM table WHERE type = '1'),
(SELECT sum(column2) FROM table WHERE type = '2'))
它從其參數中返回第一個非空結果。
在我的情況下,如果值爲空,我只想獲得非空值。藉助COALESCE,它將從其論點中返回第一個非價值。我誤解了COALESCE,還是可以這樣寫:如果原始值爲空,它只會從參數中獲取第一個非空值? – mediasurface
「是否可以這樣寫:只有當原始值爲空時,它纔會從參數中獲取第一個非空值?」如果原始值爲空,它將從其參數中獲取第一個非空值。如果原始值不爲空,則返回原始值。我不確定我瞭解你的問題。 – Amy
嘗試使用COALESCE(如果您使用的是SQL Server)。 http://msdn.microsoft.com/en-us/library/ms190349.aspx
它會爲您提供值列表中的第一個非空值。你還需要更多幫助來構建SQL嗎?
在我的情況下,如果值爲空,我只想獲得一個非空值。藉助COALESCE,它將從其論點中返回第一個非價值。我誤解了COALESCE,還是可以這樣寫:如果原始值爲空,它只會從參數中獲取第一個非空值? – mediasurface
您正在閱讀COALESCE。如果您需要確保只返回結果不爲null的行,則可以通過檢查(Value1 IS NOT NULL或Value2 IS NOT NULL OR等)來處理WHERE子句中的行。這將確保您的結果僅包含將生成非空值的行。但是......您也可以將您在另一個查詢中寫入的查詢(使其成爲子查詢)並指定您只想要返回COALESCE的結果不爲null的行。如果這沒有意義,我可以更多地解釋這一點。 –
是的,這是可能的。
(我在這個問題表達看到的問題是不平衡的括號;兩個額外的收盤括號)
的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
你是否推薦使用ISNULL這種方式,或者你的意思是根據你的經驗,這往往不能很好地工作? – mediasurface
@mediasurface:我認爲你可以使用ISNULL。問題中的表達式很好(除了不匹配的parens之外),只要它返回所需的結果集即可。正如其他答案所指出的那樣,您可以使用更便攜的符合ANSI標準的'COALESCE'功能完成相同的結果。 – spencer7593
@JoachimIsaksson對不起,似乎一個不同的RDBMS – user4035
@ user4035看起來像SQL Server的'ISNULL()',但我想它可能存在也在其他數據庫中。 –
@JoachimIsaksson是的,它是SQL Server。在MySQL中,相應的運算符稱爲IFNULL – user4035