MySql Case не возвращает ожидаемое значение в NULL - PullRequest
0 голосов
/ 18 февраля 2019

У меня следующий запрос:

SELECT  t1.id,
        t1.collection_date,
        t2.last_order_date,
        t2.hasOrders
FROM job_details AS t1
    LEFT JOIN
        (
        SELECT  job_id, 
                MAX(date) AS last_order_date,
                (CASE COALESCE(MAX(date), '0000-01-01') WHEN '0000-01-01' THEN 'false' ELSE 'true' END) AS hasOrders
        FROM sales_orders
        GROUP BY job_id
        )
    AS t2
    ON t2.job_id = t1.id

Я ожидаю, что t2.hasOrders будет true или false после CASE части LEFT JOIN, но я продолжаю получать либоtrue или NULL, как показано здесь

Я знаю, что t2.date всегда будет возвращать действительную дату или значение столбца по умолчанию 0000-00-00.

Это упрощенная версия моего запроса, поскольку таблица, которую запрашивает LEFT JOIN, является временной таблицей.

Почему значения NULL для t2.date не возвращают ожидаемый результат?

Заранее спасибо.

РЕДАКТИРОВАТЬ 1

ССЫЛКА НА ДЕМОНСТАЦИЮ - удалено where часть запроса

РЕДАКТИРОВАТЬ 2

Ожидаемый результат:

id      collection_date     last_order_date     hasOrders
1001    2019-02-07          2019-02-01          true
1002    2019-02-09          0000-01-01          false

Фактический результат:

 id     collection_date     last_order_date     hasOrders
1001    2019-02-07          2019-02-01          true
1002    2019-02-09          NULL                NULL

Изменить 3

Обновлен вышеуказанный запрос для включения group by в left join части запроса и изменили 0000-00-00 на 0000-01-01, как предложено.Все еще не работает, как ожидалось.

Ответы [ 3 ]

0 голосов
/ 18 февраля 2019

Вы должны поставить t1.collection_date <= '2019-02-09' как для job_id 1002 дата '2019-02-09'

SELECT  t1.id,
        t1.collection_date,
        t2.order_date,
        t2.hasOrders
FROM job_details AS t1
    LEFT JOIN
        (
        SELECT  job_id, 
                MAX(date) AS order_date,
                (CASE COALESCE(MAX(date), '0000-00-00') WHEN '0000-00-00' THEN 'false' ELSE 'true' END) AS hasOrders
        FROM sales_orders group by job_id
        )
    AS t2
    ON t2.job_id = t1.id
WHERE t1.collection_date <= '2019-02-09'
0 голосов
/ 18 февраля 2019

Я думаю, что, перемещая 'Max' и group by во внешний оператор, логика должна, по крайней мере, работать нормально (необходимо добавить оператор 'Coalesce', если вы хотите также вычислить этот столбец).Не уверен в производительности, но я бы сначала посмотрел, если результат в целом хорошо.Надеюсь, синтаксис в порядке, не проверял.

SELECT  t1.id,
        t1.collection_date,
        MAX(t2.last_order_date)
FROM job_details AS t1
        LEFT JOIN
        (
        SELECT  job_id, 
                last_order_date
        FROM sales_orders
        )
    AS t2
    ON t2.job_id = t1.id
GROUP BY t1.id
0 голосов
/ 18 февраля 2019

Вам необходимо переместить CASE WHEN во внешний запрос, поскольку внутренний CASE WHEN никогда не будет выполнен, если в sales_orders

SELECT  t1.id,
    t1.collection_date,
    COALESCE(t2.last_order_date, '0001-01-01') order_date,
    CASE COALESCE(t2.last_order_date, '0001-01-01') 
      WHEN '0001-01-01' THEN 'false' 
      ELSE 'true' 
    END flag
FROM job_details AS t1
LEFT JOIN
  (SELECT  job_id, MAX(date) AS last_order_date
   FROM sales_orders
   GROUP BY job_id
  ) AS t2
 ON t2.job_id = t1.id
нет строк
...