Comment exclure des valeurs NULL dans CONCAT MySQL?

14

Si j'ai ceci - tadd est le Addresstableau:

CONCAT(tadd.street_number, ' ',
            tadd.street_name,', ',
            tadd.apt_number,', ',
            tadd.city,', ',
            tadd.postal_code,', ',
            tadd.country) AS 'Address'

Existe-t-il un moyen d'exclure apt_number s'il n'existe pas?

Je pensais à:

WHERE tadd.apt_number IS NOT NULL

Mais il ne renverra que les lignes avec apt_number, et même si quelque chose fonctionne, comment puis-je gérer cette virgule supplémentaire.

S'il s'agit d'un doublon, veuillez poster un lien dans les commentaires.

ed-ta
la source

Réponses:

18

Si vous souhaitez ignorer des NULLvaleurs (mais pas des chaînes vides), vous pouvez utiliser la CONCAT_WS()fonction:

CONCAT_WS( ', ',            -- Separator
           CONCAT_WS(' ', tadd.street_number, tadd.street_name),
           tadd.apt_number,  tadd.city, 
           tadd.postal_code, tadd.country
         ) AS Address

De la documentation:

CONCAT_WS(separator,str1,str2,...)

CONCAT_WS()signifie Concaténer avec séparateur et est une forme spéciale de CONCAT(). Le premier argument est le séparateur pour le reste des arguments. Le séparateur est ajouté entre les chaînes à concaténer. Le séparateur peut être une chaîne, tout comme le reste des arguments. Si le séparateur est NULL, le résultat est NULL.

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

ypercubeᵀᴹ
la source
8

Convertissez les NULLvaleurs dans une chaîne vide en les enveloppant dans COALESCEou IFNULL:

IFNULL:

SELECT
    CONCAT(IFNULL(tadd.street_number,''),
        ' ',IFNULL(tadd.street_name,''),
        ', ',IFNULL(tadd.apt_number,''),
        ', ',IFNULL(tadd.city,''),
        ', ',IFNULL(tadd.postal_code,''),
        ', ',IFNULL(tadd.country,'')) AS 'Address'
FROM db.tbl;

SE FONDRE:

SELECT
    CONCAT(COALESCE(tadd.street_number,''), 
        ' ',COALESCE(tadd.street_name,''),
        ', ',COALESCE(tadd.apt_number,''),
        ', ',COALESCE(tadd.city,''),
        ', ',COALESCE(tadd.postal_code,''),
        ', ',COALESCE(tadd.country,'')) AS 'Address'
FROM db.tbl
oNare
la source
3
CONCAT(
    tadd.street_number, ' ', tadd.street_name, ', ',
-- concat() will return null if one is null, so ifnull returns empty string in that case
    IFNULL(CONCAT(tadd.apt_number, ', '), ''),
    tadd.city, ', ', tadd.postal_code, ', ',tadd.country
) AS 'Address'
jkavalik
la source
1
CONCAT_WS('',         -- hack, empty delimiter
        tadd.street_number, ' ',
        tadd.street_name,', ',
        CONCAT(tadd.apt_number,', '), -- hack, this line will become NULL, when apt_number is null, and will be omitted with delimiter
        tadd.city,', ',
        tadd.postal_code,', ',
        tadd.country) AS 'Address'

Je ne connais pas mon sql, mais en MS SQL (TQSL) la solution ressemble à:

SELECT
        tadd.street_number + ' ' +
        tadd.street_name + ', ' +
        ISNULL(tadd.apt_number  + ', ', '') +
        tadd.city + ', ' +
        tadd.postal_code + ', ' +
        tadd.country AS 'Address'

De plus, vous pouvez omettre tous les NULLchamps, pas seulement apt_number (mysql encore):

SELECT CONCAT_WS(', ',
        CONCAT(tadd.street_number, ' ', tadd.street_name),
        tadd.apt_number,
        tadd.city,
        tadd.postal_code,
        tadd.country) AS 'Address'
maxkoryukov
la source