2016-09-23 18 views
1

我有3列:加入列,如果其中有一個是空

col1, int 
col2, char(10) 
col3, char(11) 

其中只有一個在他們的任何值,也可以是其中一方。

我想檢查哪些列是空的,並添加一個,其中有一個值的第四列:col4。

我使用T-SQL

+1

不要存儲那樣的數據。 – jarlh

+1

你不說明你正在使用什麼數據庫。但請查看'Coalesce'聲明。這應該爲你做。 – bilpor

+0

Col4的數據類型? – jarlh

回答

1
SELECT COALESCE(CONVERT(CHAR(11), col1), CONVERT(CHAR(11), col2), col3) 
FROM yourtable; 

TSQL: COALESCE

+0

它的工作。 thansk。 – uba2012

3

試試這個

select col1,col2,col3, coalesce(col1, coalesce(col2,col3)) as col4 
from your_table 

COALESCE返回表達式列表中的第一個非空expr的。如果所有expr的值都爲null,那麼函數返回null。

+2

爲什麼聚結內部合併?爲什麼不只是'coalesce(col1,col2,col3)'? – JohnHC

+0

這是因爲TS沒有指定他使用的數據庫。例如Firebird只支持兩個參數。 – Evgeny

+0

請注意,列的數據類型不匹配。 – jarlh

3

你可以使用IS NULL比較返回一個true或false爲每列和COALESCE()找到所有列中的第一個非空值

SELECT 
    col1 IS NULL AS col1_null, 
    col2 IS NULL AS col2_null, 
    col3 IS NULL AS col3_null, 
    COALESCE(cast(col1 as char(11)), cast(col2 as char(11)), cast(col3 as char(11)) AS first_not_null_val 
FROM table 

COALESCE()函數中提供的列的順序很重要,但由於這三個中只有一個不爲空,所以它總是會返回那個。

注意:您需要將您的列轉換爲COALESCE()的相同數據類型。由於您的上限爲char(11),因爲它涵蓋了char(10)int類型,我已經提出了這個問題。我想你想保留空間,這就是爲什麼你首先使用char

+0

請注意,列的數據類型不匹配。 – jarlh

+0

@jarlh好點。 –

+0

謝謝!!數據庫有不同的類型,我正在清理這些表,所以它們變得更加可用 – uba2012

相關問題