MySQL CONCAT returns NULL if any field contain NULL

MysqlSqlNullConcat

Mysql Problem Overview


I have following data in my table "devices"

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	

I executed below query

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

It returns result given below

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

How to come out of this so that it should ignore NULL AND result should be

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-

Mysql Solutions


Solution 1 - Mysql

convert the NULL values with empty string by wrapping it in COALESCE

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

Solution 2 - Mysql

Use CONCAT_WS instead:

> CONCAT_WS() does not skip empty strings. However, it does skip any NULL values after the separator argument.

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

Solution 3 - Mysql

CONCAT_WS still produces null for me if the first field is Null. I solved this by adding a zero length string at the beginning as in

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

however

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

produces Null when the first field is Null.

Solution 4 - Mysql

To have the same flexibility in CONCAT_WS as in CONCAT (if you don't want the same separator between every member for instance) use the following:

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

Solution 5 - Mysql

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

Solution 6 - Mysql

Reason: >MySQL :: Reference Manual :: 12.8 String Functions and Operators says: > >CONCAT() returns NULL if any argument is NULL.

Solution: > MySQL :: Reference Manual :: 12.5 Flow Control Functions says: > > IFNULL(expr1,expr2) >If expr1 is not NULL, IFNULL() returns expr1; otherwise it returns expr2.

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

Solution 7 - Mysql

you can use if statement like below

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNeerajView Question on Stackoverflow
Solution 1 - MysqlJohn WooView Answer on Stackoverflow
Solution 2 - MysqlGurmeetView Answer on Stackoverflow
Solution 3 - MysqlKen4EdgeView Answer on Stackoverflow
Solution 4 - MysqlpatrickView Answer on Stackoverflow
Solution 5 - MysqlHarshilView Answer on Stackoverflow
Solution 6 - MysqlShamsul ArefinView Answer on Stackoverflow
Solution 7 - MysqlDinesh RabaraView Answer on Stackoverflow