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.
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 deCONCAT()
. 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 estNULL
, le résultat estNULL
.
CONCAT_WS()
ne saute pas les chaînes vides. Cependant, il ignore toutes les valeursNULL
après l'argument séparateur.
Convertissez les valeurs de NULL
dans une chaîne vide en les enveloppant dans COALESCE
ou 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;
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
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'
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'