web-dev-qa-db-ja.com

CONCAT MySQL内のNULL値を除外する方法は?

これがある場合-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の行のみを返します。何かが機能しても、余分なコンマを処理する方法を教えてください。

重複している場合は、コメントにリンクを投稿してください。

16
ed-ta

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 With Separatorの略で、CONCAT()の特殊な形式です。最初の引数は、残りの引数の区切り文字です。区切り文字は、連結される文字列の間に追加されます。区切り文字は、残りの引数と同様に文字列にすることができます。セパレータがNULLの場合、結果はNULLになります。

CONCAT_WS()は空の文字列をスキップしません。ただし、セパレータ引数の後のNULLはスキップされません。

20
ypercubeᵀᴹ

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;

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
9
oNare
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'
3
jkavalik
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'

my sqlはわかりませんが、-[〜#〜] ms [〜#〜] SQL(TQSL)では、ソリューションは次のようになります。

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

さらに、apt_numberだけでなく、すべてのNULLフィールドを省略できます(再びmysql)。

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