วิธีการยกเว้นค่า NULL ภายใน CONCAT MySQL


15

หากฉันมีสิ่งนี้ - tadd คือAddressตาราง:

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

มีวิธียกเว้น apt_number หรือไม่หากไม่มีอยู่?

ฉันคิดว่า:

WHERE tadd.apt_number IS NOT NULL

แต่มันจะคืนค่าเฉพาะแถวเหล่านั้นด้วยapt_numberและแม้ว่าบางสิ่งจะทำงานฉันจะจัดการกับเครื่องหมายจุลภาคพิเศษนั้นได้อย่างไร

หากเป็นรายการซ้ำโปรดโพสต์ลิงก์ในความคิดเห็น

คำตอบ:


19

หากคุณต้องการข้ามNULLค่า (แต่ไม่ใช่สตริงว่าง) คุณสามารถใช้CONCAT_WS()ฟังก์ชัน:

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

จากเอกสาร:

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

CONCAT_WS()ย่อมาจาก Concatenate CONCAT()ด้วยแยกและเป็นรูปแบบพิเศษของ อาร์กิวเมนต์แรกคือตัวคั่นสำหรับอาร์กิวเมนต์ที่เหลือ ตัวคั่นถูกเพิ่มระหว่างสตริงที่จะต่อกัน ตัวคั่นสามารถเป็นสตริงได้เช่นเดียวกับอาร์กิวเมนต์ที่เหลือ หากแยกเป็นผลที่ได้คือNULLNULL

CONCAT_WS()ห้ามข้ามสตริงว่าง อย่างไรก็ตามมันจะข้ามNULLค่าใด ๆหลังจากอาร์กิวเมนต์ตัวแยก


8

แปลงNULLค่าในสตริงว่างด้วยการตัดในCOALESCEหรือ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;

เชื่อมต่อกัน:

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'

ฉันไม่ทราบsql ของฉันแต่ในMS SQL (TQSL) โซลูชันดูเหมือน:

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

ยิ่งกว่านั้นคุณสามารถละเว้นNULLฟิลด์ทั้งหมดไม่เพียง apt_number (mysql อีกครั้ง):

SELECT CONCAT_WS(', ',
        CONCAT(tadd.street_number, ' ', tadd.street_name),
        tadd.apt_number,
        tadd.city,
        tadd.postal_code,
        tadd.country) AS 'Address'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.