web-dev-qa-db-fra.com

Comment exclure des valeurs NULL dans CONCAT MySQL?

Si j'ai ceci - tadd est la table Address:

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.

16
ed-ta

Si vous souhaitez ignorer les valeurs NULL (mais pas les chaînes vides), vous pouvez utiliser 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 valeurs NULL après l'argument séparateur.

20
ypercubeᵀᴹ

Convertissez les valeurs de NULL dans une chaîne vide en les enveloppant dans COALESCE ou 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;

COALESCE:

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
9
oNare
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'
3
jkavalik
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 sais 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 champs NULL, 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'
1
maxkoryukov