如果任何字段包含NULL,MySQL CONCAT将返回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-
通过将其包装在COALESCE
将NULL
值转换为空string
SELECT CONCAT(COALESCE(`affiliate_name`,''),'-',COALESCE(`model`,''),'-',COALESCE(`ip`,''),'-',COALESCE(`os_type`,''),'-',COALESCE(`os_version`,'')) AS device_name FROM devices
改用CONCAT_WS :
CONCAT_WS()不会跳过空string。 但是,它会在分隔符参数后面跳过任何空值。
SELECT CONCAT_WS('-',`affiliate_name`,`model`,`ip`,`os_type`,`os_version`) AS device_name FROM devices
SELECT CONCAT(isnull(`affiliate_name`,''),'-',isnull(`model`,''),'-',isnull(`ip`,''),'-',isnull(`os_type`,''),'-',isnull(`os_version`,'')) AS device_name FROM devices
要在CONCAT_WS中具有与CONCAT相同的灵活性(如果不希望每个成员之间使用相同的分隔符),请使用以下命令:
SELECT CONCAT_WS("",affiliate_name,':',model,'-',ip,... etc)
如果第一个字段为Null,CONCAT_WS仍会为我生成空值。 我通过在CONCAT_WS(“”, affiliate_name
,' – ', model
,' – ', ip
,' – ', os_version
,' – ', os_version
)中添加一个零长度的string来解决这个问题。 , affiliate_name
,' – ', model
,' – ', ip
,' – ', os_version
,' – ', os_version
)在第一个字段为Null时产生Null。
你可以使用if语句如下
select CONCAT(if(affiliate_name is null ,'',affiliate_name),'- ',if(model is null ,'',affiliate_name)) as model from devices