MySQL CONCATは、いずれかのフィールドにNULLが含まれているとNULLを返します


162

テーブル「デバイス」に次のデータがあります

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-

回答:


278

NULLラップして空の文字列で値を変換するCOALESCE

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

1
デバイスからモデルとしてCONCAT(if(affiliate_name is null、 ''、affiliate_name)、 '-'、if(model is null、 ''、affiliate_name))を選択した場合に使用できます
Dinesh Rabara

6
それらの不思議のために、私がしたように、COALESCE関数は何をしますか:関数にNULL渡された最初の非値パラメータを返します(またはNULLすべてのパラメータがである場合NULL)。空の文字列を2番目のパラメータとして渡すことにより、返されないことが保証されますNULL
ジョー。

3
mysqlには同じ構文のCOALESCEの代わりにIFNULL(arg、default)があります
Vasilii Suricov

126

代わりにCONCAT_WSを使用します。

CONCAT_WS()は空の文字列をスキップしません。ただし、セパレーター引数の後のNULL値はスキップされます。

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

申し訳ありませんneeraj私は、連結方式とWSの間で「_」を逃した)(CONCAT_WSでもう一度お試しください私は答えてくださいチェック、更新しました。
Gurmeet

8
このソリューションでは、中央のフィールドの1つがNULLの場合、完全な「列」(セパレータを含む)が非表示になることに注意してください。したがって、この答えは、最後のフィールドのみがNULLになる可能性があることを前提としています。必要に応じて、以下のCOALEASE()の回答が適切な場合があります。
Jannes 2014

これは、すべてのメンバーを同じセパレーターで区切る場合にのみ機能します。CONCATにはこの制限はありません。解決策をここに回答として投稿しました
patrick

12

CONCAT_WSでCONCATと同じ柔軟性を持たせるには(たとえば、すべてのメンバー間で同じセパレーターを使用したくない場合)、以下を使用します。

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

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

15
mysql IFNULL()ではなくISNULL()
Jeffrey NicholsonCarré

10

CONCAT_WS最初のフィールドがNullの場合でも、私はnullを生成します。私は最初に長さゼロの文字列を追加することでこれを解決しました

CONCAT_WS("",`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`)

しかしながら

CONCAT("",`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`) 

最初のフィールドがNullの場合、Nullを生成します。


明らかに、最初のフィールドは連結する文字列なので(WS = with string)
Bouke Versteegh

2
CONCAT_WSはConcatenate With Separatorの略です。最初のパラメーターはセパレーターであり、nullにすることはできません。これはおそらくあなたが代わりに欲しいものです:CONCAT_WS("-", affiliate_name, model, ip, os_type, os_version)
encrest

2

以下のようなifステートメントを使用できます

select CONCAT(if(affiliate_name is null ,'',affiliate_name),'- ',if(model is null ,'',affiliate_name)) as model from devices
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.