Wie kann man NULL-Werte in CONCAT MySQL ausschließen?

14

Wenn ich das habe - tadd ist die AddressTabelle:

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

Gibt es eine Möglichkeit, die apt_number auszuschließen, wenn sie nicht existiert?

Ich dachte an:

WHERE tadd.apt_number IS NOT NULL

Aber es werden nur die Zeilen mit zurückgegeben apt_number, und selbst wenn etwas funktioniert, wie gehe ich dann mit diesem zusätzlichen Komma um.

Wenn es sich um ein Duplikat handelt, posten Sie bitte einen Link in den Kommentaren.

ed-ta
quelle

Antworten:

18

Wenn Sie NULLWerte (aber keine leeren Zeichenfolgen) überspringen möchten , können Sie die folgende CONCAT_WS()Funktion verwenden:

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

Aus den Dokumenten:

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

CONCAT_WS()steht für Concatenate With Separator und ist eine Sonderform von CONCAT(). Das erste Argument ist das Trennzeichen für den Rest der Argumente. Das Trennzeichen wird zwischen den zu verkettenden Zeichenfolgen eingefügt. Das Trennzeichen kann eine Zeichenfolge sein, ebenso wie die übrigen Argumente. Wenn das Trennzeichen ist NULL, ist das Ergebnis NULL.

CONCAT_WS()überspringt keine leeren Zeichenketten. Allerdings hat es keine überspringen NULLWerte nach dem Trenn Argumente.

ypercubeᵀᴹ
quelle
8

Konvertieren Sie NULLWerte in eine leere Zeichenfolge, indem Sie sie in COALESCEoder einschließen 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;

VERSCHMELZEN:

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
quelle
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
quelle
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'

Ich kenne mein SQL nicht, aber in MS SQL (TQSL) sieht die Lösung so aus:

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

Außerdem können Sie alle NULLFelder weglassen , nicht nur apt_number (nochmals mysql):

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