MySQL CONCAT renvoie NULL si un champ contient NULL

163

J'ai les données suivantes dans mon tableau "appareils"

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    

J'ai exécuté la requête ci-dessous

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

Il renvoie le résultat ci-dessous

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

Comment en sortir pour qu'il ignore NULL ET le résultat devrait être

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-
neeraj
la source

Réponses:

280

convertir les NULLvaleurs avec une chaîne vide en l'enveloppant dansCOALESCE

SELECT CONCAT(COALESCE(`affiliate_name`,''),'-',COALESCE(`model`,''),'-',COALESCE(`ip`,''),'-',COALESCE(`os_type`,''),'-',COALESCE(`os_version`,'')) AS device_name
FROM devices
John Woo
la source
1
Vous pouvez utiliser if select CONCAT (if (affiliate_name is null, '', affiliate_name), '-', if (model is null, '', affiliate_name)) comme modèle à partir des appareils
Dinesh Rabara
6
Pour ceux qui se demandent, comme je l'ai fait, ce que fait la COALESCEfonction: elle renvoie le premier NULLparamètre sans valeur qui lui est passé (ou NULLsi tous les paramètres le sont NULL). En passant une chaîne vide comme deuxième paramètre, vous garantissez qu'il ne reviendra pas NULL.
Jo.
3
mysql a IFNULL (arg, default) à la place de COALESCE avec la même syntaxe
Vasilii Suricov
126

Utilisez plutôt CONCAT_WS :

CONCAT_WS () ne saute pas les chaînes vides. Cependant, il ignore toutes les valeurs NULL après l'argument séparateur.

SELECT CONCAT_WS('-',`affiliate_name`,`model`,`ip`,`os_type`,`os_version`) AS device_name FROM devices
Gurmeet
la source
Désolé neeraj j'ai manqué le '_' entre Concat et WS Veuillez réessayer avec CONCAT_WS (). J'ai mis à jour la réponse s'il vous plaît vérifier,
Gurmeet
8
Notez que cette solution masque une "colonne" complète (y compris le séparateur) si l'un des champs du milieu est NULL. Donc cette réponse n'est correcte qu'en supposant que seuls les derniers champs peuvent être NULL. Selon vos besoins, la réponse COALEASE () ci-dessous pourrait être meilleure.
Jannes
Cela ne fonctionne que si vous voulez que chaque membre soit séparé par le même séparateur. CONCAT n'a pas cette limitation. J'ai posté la solution comme réponse ici
patrick
12

Pour avoir la même flexibilité dans CONCAT_WS que dans CONCAT (si vous ne voulez pas le même séparateur entre chaque membre par exemple), utilisez ce qui suit:

SELECT CONCAT_WS("",affiliate_name,':',model,'-',ip,... etc)
patrick
la source
11
SELECT CONCAT(isnull(`affiliate_name`,''),'-',isnull(`model`,''),'-',isnull(`ip`,''),'-',isnull(`os_type`,''),'-',isnull(`os_version`,'')) AS device_name
FROM devices
Harshil
la source
15
dans mysql IFNULL () au lieu de ISNULL ()
Jeffrey Nicholson Carré
11

CONCAT_WSproduit toujours null pour moi si le premier champ est Null. J'ai résolu cela en ajoutant une chaîne de longueur nulle au début comme dans

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

toutefois

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

produit Null lorsque le premier champ est Null.

Ken4Edge
la source
évidemment, parce que le premier champ est la chaîne avec laquelle il concaténera (WS = avec chaîne)
Bouke Versteegh
2
CONCAT_WS est l'abréviation de Concatenate With Separator. Le premier paramètre est le séparateur et ne peut pas être nul. C'est probablement ce que vous voulez à la place:CONCAT_WS("-", affiliate_name, model, ip, os_type, os_version)
encrest
2

vous pouvez utiliser la déclaration if comme ci-dessous

select CONCAT(if(affiliate_name is null ,'',affiliate_name),'- ',if(model is null ,'',affiliate_name)) as model from devices
Dinesh Rabara
la source