Ответ 1
Посмотрите на функцию CONCAT_WS
. Он делает именно то, что вы хотите.
В нижеприведенном фрагменте кода я создаю поле 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 ','
Спасибо.
Посмотрите на функцию CONCAT_WS
. Он делает именно то, что вы хотите.
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)
)
Как указано здесь: Как concat_ws несколько полей и удалять дублирующие разделители для пустых слотов
Это очистит пустые строки, а также значения NULL.
CONCAT_WS(", ", NULLIF(address1, ""), NULLIF(address2, ""), NULLIF(address3, ""), NULLIF(city, ""), NULLIF(zip, ""))
Использование 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()
проверить, имеет ли поле длину, и если да, то возвращает запятую. В противном случае он возвращает пустую строку.
попробуйте MAKE_SET
SELECT MAKE_SET(11111,`address1`,`address2`,`address3`,`city`,`zip`) AS Address
Он вернет строку со значением NOT NULL, разделенным ,
Как ясно сказано в 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)
)