Подтвердить что ты не робот

Условный CONCAT с потенциально NULL или пустым значением

В нижеприведенном фрагменте кода я создаю поле Address путем конкатенации различных частей адреса.

Однако, если, например, address2 был пуст, конечный , по-прежнему будет конкатенирован в Address.

Это означает, что если все поля были пустыми, я получаю результат ,,,,.

Если address1 есть "House Number", а все остальное пусто, я заканчиваю House Number,,,,.

CONCAT( COALESCE(address1,'')   ,   ', '    , 
        COALESCE(address2,'')   ,   ', '    , 
        COALESCE(address3,'')   ,   ', '    , 
        COALESCE(city,'')       ,   ', '    , 
        COALESCE(zip, '')
) AS Address, 

Есть ли какой-либо способ условного размещения запятых между частями адреса, только если содержимое адресной части не пусто.

Например, что-то по строкам (псевдокод) IF(address1) is NULL use '' ELSE use ','

Спасибо.

4b9b3361

Ответ 1

Посмотрите на функцию CONCAT_WS. Он делает именно то, что вы хотите.

Ответ 2

CONCAT_WS(', ',
        IF(LENGTH(`address1`),`address1`,NULL),
        IF(LENGTH(`address2`),`address2`,NULL),
        IF(LENGTH(`address3`),`address3`,NULL),
        IF(LENGTH(`city`),`city`,NULL),
        IF(LENGTH(`zip`),`zip`,NULL)
)

Ответ 4

Использование CONCAT_WS, как говорит Мат, - очень хорошая идея, но я думал, что буду делать это по-другому, с беспорядочными операторами IF():

CONCAT( COALESCE(address1,''), IF(LENGTH(address1), ', ', ''), 
        COALESCE(address2,''), IF(LENGTH(address2), ', ', ''), 
        COALESCE(address3,''), IF(LENGTH(address3), ', ', ''), 
        COALESCE(city,''), IF(LENGTH(city), ', ', ''), 
        COALESCE(zip,''), IF(LENGTH(address1), ', ', ''), 
) AS Address, 

IF() проверить, имеет ли поле длину, и если да, то возвращает запятую. В противном случае он возвращает пустую строку.

Ответ 5

попробуйте MAKE_SET

SELECT MAKE_SET(11111,`address1`,`address2`,`address3`,`city`,`zip`) AS Address

Он вернет строку со значением NOT NULL, разделенным ,

Ответ 6

Как ясно сказано в doc, что:

CONCAT_WS() не пропускает пустые строки. Однако он пропускает любые Значения NULL после аргумента разделителя.

Мы можем удалить пустые пространства с помощью NULL, который элегантно обрабатывается CONCAT_WS.

CONCAT_WS(', ',
        IF(`address1` != '', `address1`, NULL),
        IF(`address2` != '', `address2`, NULL),
        IF(`address3` != '', `address3`, NULL),
        IF(`city` != '', `city, NULL),
        IF(`zip` != '', `zip, NULL)
)