2013-04-01 94 views
95

我有以下我的表中的 「設備」MySQL的CONCAT返回NULL,如果任何字段包含NULL

affiliate_name affiliate_location model  ip    os_type os_version 

cs1    inter    Dell  10.125.103.25 Linux  Fedora 
cs2    inter    Dell  10.125.103.26 Linux  Fedora 
cs3    inter    Dell  10.125.103.27 NULL  NULL  
cs4    inter    Dell  10.125.103.28 NULL  NULL  

數據我下面的查詢執行

SELECT CONCAT(`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`) AS device_name 
FROM devices 

返回結果如下

cs1-Dell-10.125.103.25-Linux-Fedora 
cs2-Dell-10.125.103.26-Linux-Fedora 
(NULL) 
(NULL) 
給出

如何走出這使得它應該忽略NULL和結果應該是

cs1-Dell-10.125.103.25-Linux-Fedora 
cs2-Dell-10.125.103.26-Linux-Fedora 
cs3-Dell-10.125.103.27- 
cs4-Dell-10.125.103.28- 

回答

157

通過包裝它COALESCE

SELECT CONCAT(COALESCE(`affiliate_name`,''),'-',COALESCE(`model`,''),'-',COALESCE(`ip`,''),'-',COALESCE(`os_type`,''),'-',COALESCE(`os_version`,'')) AS device_name 
FROM devices 
+0

您的解決方案也工作,但它包含的代碼量好。然而由Gerry給出的其他解決方案包含更少的代碼...不介意:) – neeraj

+5

雖然這個答案是完全更好,夥計。 Duuuude! – Ben

+1

這個答案是不是更靈活的選擇一個+1 – etherous

87

轉換與空字符串NULL值使用CONCAT_WS代替:

CONCAT_WS()不會跳過空字符串。但是,它會在分隔符參數後跳過任何空值。

SELECT CONCAT_WS('-',`affiliate_name`,`model`,`ip`,`os_type`,`os_version`) AS device_name FROM devices 
+0

我得到一個錯誤....功能siteconfig_development.CONCATWS不存在 – neeraj

+1

@neeraj使用CONCAT_WS()檢查一個簡單的演示http://sqlfiddle.com/#!2/d41d8/9885 – swapnesh

+0

+1更好的結果排除 - 後綴。 – neeraj

10
SELECT CONCAT(isnull(`affiliate_name`,''),'-',isnull(`model`,''),'-',isnull(`ip`,''),'-',isnull(`os_type`,''),'-',isnull(`os_version`,'')) AS device_name 
FROM devices 
+10

在mysql IFNULL()而不是ISNULL() – bleuscyther

+0

非常好!工作就像一個魅力,@bleuscyther! –

1

CONCAT_WS仍然會產生空對我來說,如果第一個字段爲空。我通過在CONCAT_WS開頭添加一個零長度的字符串來解決這個問題,但是CONCAT(「」,affiliate_name,' - ',model,' - ',ip,' - ',os_type,' - ',os_version) ,affiliate_name,' - ',model,' - ',ip,' - ',os_type,' - ',os_version)在第一個字段爲空時產生Null。

+0

Gerry給出的解決方案對我來說非常合適。 – neeraj

+0

很顯然,因爲第一個字段是它將連接的字符串(WS =帶字符串) –

+1

CONCAT_WS是Concatenate With Separator的縮寫。第一個參數是分隔符,不能爲空。這可能是你想要的:'CONCAT_WS(「 - 」,affiliate_name,model,ip,os_type,os_version)' – encrest

4

要在CONCAT_WS相同的靈活性,如CONCAT(如果你不想比如每個成員之間的相同的分隔符)使用以下命令:

SELECT CONCAT_WS("",affiliate_name,':',model,'-',ip,... etc) 
0

你可以使用if語句像下面

select CONCAT(if(affiliate_name is null ,'',affiliate_name),'- ',if(model is null ,'',affiliate_name)) as model from devices