Jak wykluczyć wartości NULL w CONCAT MySQL?

14

Jeśli mam to - tadd jest Addresstabelą:

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

Czy istnieje sposób na wykluczenie apt_number, jeśli nie istnieje?

Myślałem o:

WHERE tadd.apt_number IS NOT NULL

Ale zwróci tylko te wiersze apt_number, i nawet jeśli coś działa, jak mam poradzić sobie z tym dodatkowym przecinkiem.

Jeśli jest to duplikat, proszę zamieścić link w komentarzach.

ed-ta
źródło

Odpowiedzi:

18

Jeśli chcesz pominąć NULLwartości (ale nie puste ciągi), możesz użyć CONCAT_WS()funkcji:

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

Z dokumentów:

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

CONCAT_WS()oznacza Concatenate With Separator i jest specjalną formą CONCAT(). Pierwszy argument jest separatorem dla pozostałych argumentów. Separator jest dodawany między ciągami, które mają zostać połączone. Separator może być ciągiem, podobnie jak reszta argumentów. Jeśli separator jest NULL, wynikiem jest NULL.

CONCAT_WS()nie pomija pustych ciągów. Jednak to nie pominąć żadnych NULLwartości po argumencie separatora.

ypercubeᵀᴹ
źródło
8

Konwersja NULLwartości w pustym ciągiem przez otoczenie go COALESCElub 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;

ŁĄCZYĆ:

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
źródło
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
źródło
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'

Nie znam mojego SQL, ale w MS SQL (TQSL) rozwiązanie wygląda następująco:

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

Co więcej, możesz pominąć wszystkie NULLpola, nie tylko apt_number (ponownie mysql):

SELECT CONCAT_WS(', ',
        CONCAT(tadd.street_number, ' ', tadd.street_name),
        tadd.apt_number,
        tadd.city,
        tadd.postal_code,
        tadd.country) AS 'Address'
maxkoryukov
źródło