CONCAT MySQL içinde NULL değerler nasıl hariç tutulur?


16

Eğer ben - tadd Addresstablo varsa:

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

Mevcut değilse apt_number değerini hariç tutmanın bir yolu var mı?

Düşünüyordum ki:

WHERE tadd.apt_number IS NOT NULL

Ama sadece bu satırları döndürecek apt_numberve bir şey işe yarasa bile, o ekstra virgülle nasıl başa çıkacağım.

Yineleniyorsa, lütfen yorumlara bir bağlantı gönderin.

Yanıtlar:


20

NULLDeğerleri atlamak istiyorsanız (ancak boş dizeler değil), CONCAT_WS()işlevi kullanabilirsiniz :

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

Dokümanlardan:

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

CONCAT_WS()Ayırıcı ile bitiştir anlamına gelir ve özel bir biçimidir CONCAT(). İlk argüman, diğer argümanların ayırıcısıdır. Birleştirilecek dizeler arasına ayırıcı eklenir. Ayırıcı, argümanların geri kalanı gibi bir dize olabilir. Ayırıcı ise NULL, sonuç olur NULL.

CONCAT_WS()boş dizeleri atlamaz. Ancak, ayırıcı bağımsız değişkeninden sonra herhangi bir NULLdeğeri atlar .


9

NULLBoş dizedeki değerleri COALESCEveya içine sararak dönüştürün 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

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'

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'

Benim sql bilmiyorum , ama MS SQL (TQSL) çözüm gibi görünüyor:

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

Ayrıca, NULLsadece apt_number (tekrar mysql) değil, tüm alanları atlayabilirsiniz :

SELECT CONCAT_WS(', ',
        CONCAT(tadd.street_number, ' ', tadd.street_name),
        tadd.apt_number,
        tadd.city,
        tadd.postal_code,
        tadd.country) AS 'Address'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.