2011-06-21 80 views
39

我用下面的SQL從一個表連接多個數據庫列一列的結果集:連接兩個數據庫列一個結果列

SELECT (field1 + '' + field2 + '' + field3) FROM table1

當字段爲空我整個連接表達式的結果爲空。我該如何克服這一點?

該數據庫是MS SQL Server 2008.順便說說,這是連接數據庫列的最佳方式嗎?有沒有標準的SQL這樣做?

回答

42

的SQL這樣的標準的方式是:

SELECT COALESCE(field1, '') || COALESCE(field2, '') || COALESCE(field3, '') FROM table1 

例子:

INSERT INTO table1 VALUES ('hello', null, 'world'); 
SELECT COALESCE(field1, '') || COALESCE(field2, '') || COALESCE(field3, '') FROM table1; 

helloworld 
+5

@Steve什麼是雙管?對於SQL Server來說,這不應該只是+嗎? – rsbarro

+0

這是爲oracle –

+0

'||'是SQL標準字符串連接運算符。這個問題問到「有沒有標準的SQL這樣做?」我正在回答這個問題。也許OP會問:「有沒有簡單的SQL方法可以做到這一點?」 –

4

使用ISNULL來克服它。

例子:

SELECT (ISNULL(field1, '') + '' + ISNULL(field2, '')+ '' + ISNULL(field3, '')) FROM table1 

然後,這將取代你的NULL的內容爲空字符串將從評估作爲整體NULL結果保存concatentation操作。

14

與NULL正常行爲是包括空的任何操作生成空...

- 9 * NULL = NULL 
- NULL + '' = NULL 
- etc 

爲了克服這種使用ISNULL或COALESCE以替換NULL的任何實例。

SELECT (ISNULL(field1,'') + '' + ISNULL(field2,'') + '' + ISNULL(field3,'')) FROM table1 
+3

+1對空操作 –

+0

由於說教解釋marc_s,我的副本編輯;) – MatBailie

+2

你正在自私:marc_s是*每個人的*副本編輯:) –

30

如果您使用SQL 2012或以上,你可以使用CONCAT函數:

SELECT CONCAT(field1, field2, field3) FROM table1 

NULL字段不會破壞你的連接。

@bummi - 感謝您的評論 - 編輯我的答案,以符合它。

+2

問題是關於SQLServer 2008 CONCAT是與SQLServer 2012一起推出的 – bummi

+0

這個答案對MySQL很好。 – Peter

1

如果兩個列中的數字,然後使用此代碼

Just Cast Column As Varchar(Size)

例子:

Select (Cast(Col1 as Varchar(20)) + '-' + Cast(Col2 as Varchar(20))) As Col3 from Table 
1

只投柱爲varchar(尺寸)

如果兩個列中的數字,然後使用代碼如下。

例子:

Select (Cast(Col1 as Varchar(20)) + '-' + Cast(Col2 as Varchar(20))) As Col3 from Table 

會是怎樣的col3規模將是40或者