2016-02-01 86 views
0

我有3列我試圖進入1.在每一行中,只有3箇中的1個將被填充。例如:合併無優先

**col1 | col2 | col3** 
10 | null | null 
null | 15 | null 
null | null | 9 
22 | null | null 
null | 2 | null 
17 | null | null 

我想現在將所有列合併爲一個。
首先,是最好的辦法嗎?

其次,有沒有辦法指定COALESCE()參數的順序是否重要?

編輯:最後的結果應該是:

col1 
---- 
10 
15 
9 
22 
2 
17 
+0

最終結果會是什麼樣子? – SQLChao

+2

不確定你需要什麼,請用例子和預期結果解釋 – Horaciux

+1

「是否是最好的方法」?是**什麼**最好的方式來做到這一點? –

回答

3

試試這個:

SELECT (SELECT MAX(v) 
     FROM (VALUES (col1), (col2), (col3)) AS x(v)) 
FROM mytable   

上面的查詢,以建立一個內嵌表與所有三個表列使用Table Value Constructor。在此表上應用MAX將返回非空值。

Demo here

編輯:

看來你可以在需要的結果得到一個簡單的使用COALESCE

SELECT COALESCE(col1, col2, col3) AS col 
FROM mytable 

COALESCE表達將返回的價值第一個非空字段。

+0

爲什麼不直接使用'COALESCE'作爲OP提示? 'SELECT COALESCE(col1,col2,col3)as col FROM mytable' should do the trick。 –

+0

@ LasseV.Karlsen嗯,是的,你是對的。我在複雜的事情上。 –

+0

您還可以將其作爲持續計算的列添加,因此每次需要數據時都不需要計算出來: 'ALTER TABLE mytable ADD ACTUAL_VALUE AS COALESCE(col1,col2,col3)PERSISTED' –