Question CONCAT conditionnel avec des valeurs potentiellement NULL ou vides


Dans le morceau de code ci-dessous, je crée un champ Adresse en concaténant différentes parties d'une adresse.

Cependant, si par exemple address2 était vide, le trailing , sera toujours concaténé dans Adresse.

Cela signifie que si tous les champs étaient vides, je me retrouve avec un résultat de ,,,,.

Si address1 est "House Number" et tout le reste est vide, je me retrouve avec House Number,,,,.

CONCAT( COALESCE(address1,'')   ,   ', '    , 
        COALESCE(address2,'')   ,   ', '    , 
        COALESCE(address3,'')   ,   ', '    , 
        COALESCE(city,'')       ,   ', '    , 
        COALESCE(zip, '')
) AS Address, 

Existe-t-il un moyen de placer conditionnellement les virgules entre les parties d'adresse uniquement si le contenu d'une partie adresse n'est pas vide.

Tels que quelque chose dans le sens de (pseudo-code) IF(address1) is NULL use '' ELSE use ',' 

Je vous remercie.


17
2017-10-13 08:50


origine


Réponses:


Regardez le CONCAT_WS fonction. Il fait exactement ce que vous voulez.


26
2017-10-13 08:54



CONCAT_WS(', ',
        IF(LENGTH(`address1`),`address1`,NULL),
        IF(LENGTH(`address2`),`address2`,NULL),
        IF(LENGTH(`address3`),`address3`,NULL),
        IF(LENGTH(`city`),`city`,NULL),
        IF(LENGTH(`zip`),`zip`,NULL)
)

32
2018-04-02 00:02



Comme répondu ici: Comment concat_ws plusieurs champs et supprimer les séparateurs en double pour les emplacements vides

Cela effacera les chaînes vides ainsi que les valeurs NULL.

CONCAT_WS(", ", NULLIF(address1, ""), NULLIF(address2, ""), NULLIF(address3, ""), NULLIF(city, ""), NULLIF(zip, ""))

4
2018-04-15 12:16



En utilisant CONCAT_WS comme le dit Mat est une très bonne idée, mais je pensais que je le ferais d’une manière différente, avec du désordre IF() déclarations:

CONCAT( COALESCE(address1,''), IF(LENGTH(address1), ', ', ''), 
        COALESCE(address2,''), IF(LENGTH(address2), ', ', ''), 
        COALESCE(address3,''), IF(LENGTH(address3), ', ', ''), 
        COALESCE(city,''), IF(LENGTH(city), ', ', ''), 
        COALESCE(zip,''), IF(LENGTH(address1), ', ', ''), 
) AS Address, 

le IF()s vérifiez si le champ a une longueur et si oui, retourne une virgule. Sinon, il renvoie une chaîne vide.


3
2017-10-13 08:57



essayer avec MAKE_SET

SELECT MAKE_SET(11111,`address1`,`address2`,`address3`,`city`,`zip`) AS Address

Il retournera une chaîne avec toutes les valeurs NOT NULL séparées par , 


3
2018-04-18 12:37



Comme il est clairement mentionné dans le doc cette:

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

nous pouvons supprimer les espaces vides par NULL qui est élégamment géré par CONCAT_WS.

CONCAT_WS(', ',
        IF(`address1` != '', `address1`, NULL),
        IF(`address2` != '', `address2`, NULL),
        IF(`address3` != '', `address3`, NULL),
        IF(`city` != '', `city, NULL),
        IF(`zip` != '', `zip, NULL)
)

1
2017-12-12 14:02