Bagaimana cara mengecualikan nilai NULL di dalam CONCAT MySQL?

14

Jika saya punya ini - tadd adalah Addresstabel:

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

Apakah ada cara untuk mengecualikan apt_number jika tidak ada?

Saya sedang memikirkan:

WHERE tadd.apt_number IS NOT NULL

Tapi itu akan mengembalikan hanya baris-baris itu apt_number, dan bahkan jika sesuatu bekerja bagaimana saya kemudian berurusan dengan koma ekstra itu.

Jika itu duplikat, silakan kirim tautan dalam komentar.

ed-ta
sumber

Jawaban:

18

Jika Anda ingin melewatkan NULLnilai (tetapi tidak mengosongkan string), Anda dapat menggunakan CONCAT_WS()fungsi:

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

Dari dokumen:

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

CONCAT_WS()singkatan Concatenate With Separator dan merupakan bentuk khusus dari CONCAT(). Argumen pertama adalah pemisah untuk sisa argumen. Pemisah ditambahkan di antara senar yang akan digabungkan. Pemisah bisa berupa string, seperti halnya sisa argumen. Jika separatornya NULL, hasilnya adalah NULL.

CONCAT_WS()tidak melewatkan string kosong. Namun, ia melewatkan NULLnilai apa pun setelah argumen pemisah.

ypercubeᵀᴹ
sumber
8

Konversi NULLnilai dalam string kosong dengan membungkusnya dengan COALESCEatau 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;

BERGABUNG:

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

Saya tidak tahu sql saya , tetapi dalam MS SQL (TQSL) solusinya terlihat seperti:

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

Selain itu, Anda dapat menghilangkan semua NULLbidang, bukan hanya apt_number (mysql lagi):

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