Несколько COALESCE в GROUP_CONCAT - показывает значение, если только первый столбец не нулевой - PullRequest
0 голосов
/ 06 января 2019

Два столбца таблицы purchase и sales date объединены в строку date.

GROUP_CONCAT(purchase.date,',',sales.date) AS date

Но оба они могут быть пустыми, в зависимости от ввода данных. Таким образом, я объединился как

GROUP_CONCAT(COALESCE(purchase.date,''),',',COALESCE(sales.date,''))AS date

Здесь, почему, если purchase.date пусто и sales.date имеет значение, столбец sales.date также выбирается как пустой? но в случае purchase.date значение отображается, даже если sales.date пусто.

Я имею в виду, что мой код не работает для второго столбца GROUP_CONCAT. Значение второго столбца отображается только в том случае, если первый столбец не пустой.

Я пытался с

GROUP_CONCAT(COALESCE(purchase.date,',',sales.date),'')AS date

GROUP_CONCAT(COALESCE(purchase.date,',',sales.date,'')AS date

но второй столбец показывает ноль, хотя и имеет значение. если я переместу sales.date в первую позицию, он покажет значение.

Вот скрипка. date показывает значение, потому что sales.date находится в первой позиции, date1 возвращает пустое значение, потому что sales.date находится во второй позиции.

Sql Fiddle

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Это не делает то, что вы, кажется, хотите, чтобы:

COALESCE(sales.date, ',', purchase.date)

COALESCE() возвращает первое из трех значений, которое не является NULL, поэтому вы никогда не получите purchase.date: ',' никогда не будет NULL.

Вы в основном хотите:

GROUP_CONCAT(purchase.date, ',', sales.date) AS date

Однако вы узнали, что CONCAT() - и даже это неявное сцепление - возвращают NULL, если любое из значений равно NULL. Одно решение индивидуально COALESCE() - как в вашем ответе. Я не могу воспроизвести вашу проблему. Здесь - пример работающего кода.

Или вы можете использовать CONCAT_WS() (хотя вам не хватает разделителя):

GROUP_CONCAT(CONCAT_WS(',', sales.date, purchase.date))
0 голосов
/ 06 января 2019

Я не уверен, что здесь достаточно только COALESCE, как сказал @TimBiegeleisen - COALESCE всегда возвращает первое значение, отличное от NULL, в своем списке. Поэтому я применяю CASE условие

  CASE
    WHEN purchase.date IS NULL THEN GROUP_CONCAT(COALESCE(sales.date,'')) 
    WHEN sales.date IS NULL THEN GROUP_CONCAT(COALESCE(purchase.date,'')) 
    WHEN purchase.date !='' AND sales.date !='' THEN GROUP_CONCAT(COALESCE(purchase.date,',',sales.date),'')
  END AS date1
...