MySQL CONCAT возвращает NULL, если какое-либо поле содержит NULL

У меня есть следующие данные в моей таблице "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    

Я выполнил ниже запрос

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-

Ответ 1

преобразуйте значения NULL в пустую строку, обернув ее в COALESCE

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

Ответ 2

Используйте CONCAT_WS вместо:

CONCAT_WS() не пропускает пустые строки. Тем не менее, он пропускает любые значения NULL после аргумента разделителя.

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

Ответ 3

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

Ответ 4

Чтобы иметь такую ​​же гибкость в CONCAT_WS, что и в CONCAT (если вы не хотите, чтобы один и тот же разделитель между каждым членом, например), используйте следующее:

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

Ответ 5

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.

Ответ 6

вы можете использовать оператор if, как показано ниже

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

Ответ 7

@Джерри ответ работал для меня. Однако, у меня были странные проблемы с результатами, являющимися всеми нулями, или я вижу, что "NULL" сцепляется в столбце результата. Я заметил, что мой буфер был на 100%, и полный перезапуск решил проблему.