237 votes

MySQL CONCAT renvoie NULL si un champ contient NULL.

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

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 suivante

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

Il retourne le résultat suivant

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

Comment s'en sortir pour qu'il ignore NULL et que le résultat soit

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-

389voto

John Woo Points 132738

Convertir le NULL avec une chaîne vide en l'enveloppant dans COALESCE

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

163voto

Gerry Points 649

Utilice CONCAT_WS à la place :

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

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

18voto

Ken4Edge Points 177

CONCAT_WS produit toujours null pour moi si le premier champ est Null. J'ai résolu ce problème en ajoutant une chaîne de longueur nulle au début, comme dans le cas suivant

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

cependant

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

produit Null lorsque le premier champ est Null.

14voto

patrick Points 2038

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)

11voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X