Làm cách nào để loại trừ các giá trị NULL bên trong CONCAT MySQL?


14

Nếu tôi có cái này - tadd là cái Addressbàn:

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

Có cách nào để loại trừ apt_number nếu nó không tồn tại?

Tôi đã suy nghĩ về:

WHERE tadd.apt_number IS NOT NULL

Nhưng nó sẽ chỉ trả về những hàng đó apt_numbervà ngay cả khi một cái gì đó hoạt động thì làm thế nào để tôi xử lý dấu phẩy thừa đó.

Nếu đó là một bản sao xin vui lòng gửi một liên kết trong các ý kiến.

Câu trả lời:


18

Nếu bạn muốn bỏ qua NULLcác giá trị (nhưng không phải chuỗi rỗng), bạn có thể sử dụng CONCAT_WS()hàm:

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

Từ các tài liệu:

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

CONCAT_WS()là viết tắt của Concatenate With separator và là một dạng đặc biệt của CONCAT(). Đối số đầu tiên là dấu phân cách cho phần còn lại của các đối số. Dấu phân cách được thêm vào giữa các chuỗi được nối. Dấu phân cách có thể là một chuỗi, phần còn lại của các đối số. Nếu dấu phân cách là NULL, kết quả là NULL.

CONCAT_WS()không bỏ qua các chuỗi trống. Tuy nhiên, nó không bỏ qua bất kỳ NULLgiá trị nào sau đối số dấu phân cách.


8

Chuyển đổi NULLgiá trị trong chuỗi trống bằng cách gói nó trong COALESCEhoặc IFNULL:

NẾU

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;

HỢP ĐỒNG:

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'

Tôi không biết sql của mình , nhưng trong MS SQL (TQSL), giải pháp trông như sau:

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

Hơn nữa, bạn có thể bỏ qua tất cả các NULLtrường, không chỉ apt_number (lại là mysql):

SELECT CONCAT_WS(', ',
        CONCAT(tadd.street_number, ' ', tadd.street_name),
        tadd.apt_number,
        tadd.city,
        tadd.postal_code,
        tadd.country) AS 'Address'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.