Как объединить, объединить и игнорировать нули во время выбора? MySql - PullRequest
0 голосов
/ 01 ноября 2018

Мой стол примерно такой:

Id | Name | ph_office | ph_home   
1  | ab   |  111      | NULL   
2  | cd   |  NULL     | 222   
3  | ef   |  333      | 444  
4  | gh   |  NULL     | NULL

и я хочу добавить имя соответствующего столбца к соответствующему значению. как то так:

Id | Name | phone   
1  | ab   |  phone_office: 111   
2  | cd   |  phone_home: 222  
3  | ef   |  phone_office: 333, phone_home: 444  
4  | gh   |  NULL 

Я пытался использовать

select id, Name, 
CONCAT('ph_office: ', COALESCE(ph_office,''),',','ph_home:',COALESCE(ph_home,'')) as phone
from contacts;

Id | Name | phone  
1  | ab   |  ph_office: 111,ph_home:  
2  | cd   |  ph_office:, ph_home: 222  
3  | ef   |  ph_office: 333, ph_home: 444  
4  | gh   |  ph_office:,ph_home   

Я хочу игнорировать столбец с нулем. Я не очень хорош в case заявлениях. Как это можно сделать в MySQL?

Спасибо за ваше время

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Использование CONCAT_WS():

select id, Name, 
       concat_ws(', ',
                 concat('phone_office: ', ph_office),
                 concat('ph_home: ', ph_home) 
                ) as phones
from contacts;
0 голосов
/ 01 ноября 2018
  • Вместо Concat() можно использовать функцию Concat_ws(). Он используется для объединения нескольких подстрок с заданным разделителем. Если какая-либо из подстрок Null, она пропускается. Это поможет нам в случаях, когда любой из них null; чтобы у нас не осталось запятых в начале / конце.
  • Кроме того, вы можете использовать Case .. When для рассмотрения строки для объединения только при ее значении IS NOT NULL

Попробуйте вместо этого следующее:

SELECT 
  id, 
  Name, 
  CONCAT_WS(', ', 
            (CASE 
              WHEN ph_office IS NOT NULL THEN CONCAT('ph_office: ', ph_office)
             END),  
            (CASE 
              WHEN ph_home IS NOT NULL THEN CONCAT('ph_home: ', ph_home)
             END)
          ) AS phone
FROM contacts;

РЕДАКТИРОВАТЬ (не понял, что Гордон Линофф уже ответил, используя следующий подход):

Тем не менее, более аккуратная техника без использования Case .. When возможна. Из функции Документы из Concat():

CONCAT () возвращает NULL, если любой аргумент равен NULL.

SELECT 
  id, 
  Name, 
  CONCAT_WS(', ', 
            CONCAT('ph_office: ', ph_office), 
            CONCAT('ph_home: ', ph_home)
           ) AS phone
FROM contacts;

Обратите внимание , что это будет работать, только если значение ph_office или ph_home равно Null вместо пустой строки.

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