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-

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

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

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)

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

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.


é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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.