2009-06-23 62 views
53

我有一個表有三個字段,FirstName,LastName和Email。CONCAT'ing NULL字段

下面是一些虛擬的數據:

FirstName | LastName | Email 
Adam  West  [email protected] 
Joe   Schmoe  NULL 

現在,如果我做的:

SELECT CONCAT(FirstName, LastName, Email) as Vitals FROM MEMBERS 

生命體徵喬爲空,因爲有一個單一的空場。你如何克服這種行爲?另外,這是MS SQL Server中的默認行爲嗎?

回答

111

嘗試

ISNULL(FirstName, '<BlankValue>') -- In SQL Server 
IFNULL(Firstname, '<BlankValue>') -- In MySQL 

所以,

CONCAT(ISNULL(FirstName,''),ISNULL(LastName,''),ISNULL(Email,'')) -- In SQL Server 
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,'')) -- In MySQL 

將返回同樣的事情,沒有空的問題(一個空字符串,其中空值應該是)。

+0

非常好,謝謝! – 2009-06-24 00:05:48

+9

見[BILBO答案](http://stackoverflow.com/a/5792720/532060)約[CONCAT_WS](http://dev.mysql.com/doc/refman/5.0/en/string-functions.html# function_concat-WS),在我看來 – dvb 2012-01-17 14:17:59

+3

一個更好的解決方案這不會與MySQL數據庫工作... CONCAT_WS()似乎是一個更通用的解決方案。 – ricosrealm 2012-02-23 09:31:14

3

Stefan的回答是正確的。 要深入探究,您需要知道NULL與Nothing不同。空值表示沒有值,或者換句話說,沒有定義。沒有任何東西代表一個空字符串,它實際上是一個值。

未定義+ anything = undefined

好的數據庫珍聞!

2

SQL Server沒有CONCAT函數。
(更新:從MS SQL Server 2012開始it was introduced CONCAT function

在默認的SQL Server行爲中,NULL通過表達式傳播。

在SQL Server中,一個會寫:

SELECT FirstName + LastName + Email as Vitals FROM MEMBERS 

如果您需要處理NULL S:

SELECT ISNULL(FirstName, '') + ISNULL(LastName, '') + ISNULL(Email, '') as Vitals FROM MEMBERS 
5
SELECT ISNULL(FirstName,'')+ISNULL(LastName,'')+ISNULL(Email,'') as Vitals FROM MEMBERS 

建議,但如果你真的迷上了CONCAT,包它在{fn}中,您可以使用ODBC函數,如:

SELECT {fn CONCAT(ISNULL(FirstName,''), ISNULL(LastName,''), ISNULL(Email,''))} as Vitals FROM MEMBERS 

如果你需要先<空間>最後只是倒數第一的時候是空,你可以這樣做:

ISNULL(FirstName+' ','') + ISNULL(LastName,'') 

我加在名字空間可能是空 - 這將意味着該空間將只能存活,如果名字有一個值。

爲了把它們放在一起,每個之間的空間:

RTRIM(ISNULL(Firstname+' ','') + ISNULL(LastName+' ','') + ISNULL(Email,'')) 
5

您可以隨時使用CONCAT_NULL_YIELDS_NULL設置..

只需運行SET CONCAT_NULL_YIELDS_NULL OFF,然後將所有null級聯會導致文字,而不是空..

12

在MySQL ISNULL不會工作一段時間。嘗試IFNULL(),

CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,'')) 
67

CONCAT_WS

例如:

CONCAT_WS('',NULL,"TEST STRING","TEST STRING 2") 

息率

TEST STRINGTEST STRING 2

這比建設IFNULL周圍的一切更加容易。您可以使用空字符串作爲分隔符。

3

如果你(像我在MySQL做):

#1582 - Incorrect parameter count in the call to native function 'ISNULL' 

您可以通過COALESCE代替ISNULL功能:

CONCAT(COALESCE(FirstName,''),COALESCE(LastName,''),COALESCE(Email,'')) 
1

在MS Access的情況下

選項1) SELECT(FirstName +「」+ LastName +「」+ Email)as Vitals FROM MEMBERS 如果任何字段爲空,您將得到空白結果。

選項2)選擇(名字&「」 &姓氏&「」 &電子郵件)爲命脈議員 您將在地方場與空得空間。

0

觀察對此問題的回答後,您可以結合所有的人都變成一個簡單的解決方案

CONCAT_WS(',', 
IF(NULLIF(FirstName, '') IS NULL, NULL, FirstName), 
IF(NULLIF(LastName, '') IS NULL, NULL, usr_lastname), 
IF(NULLIF(Email, '') IS NULL, NULL, Email)) 

所以,總之我們使用CONCAT_WS來連接我們的領域,並與,分開;並注意NULL領域也不EMPTY不會級聯

NULLIF將檢查該字段爲NULLEMPTY,只包含空格或爲空,以及一個字段,例如:「」,'「)和輸出將是要麼NULLNOT NULL

IF會出來把場,如果它不是NULLEMPTY

1

從MS SQL Server 2012中據介紹CONCAT啓動函數 和according to MSDN

空值被隱式轉換爲空字符串。如果所有 參數都爲空,則返回一個類型爲varchar(1)的空字符串。

所以它足夠使用CONCAT沒有ISNULL

CONCAT(FirstName, LastName, Email)