bogdan_uman
@bogdan_uman
шлЫмазл неукЪ-поцЪ

Как выполнять фильтрацию в оконной функции?

Как правильно сделать запрос в MySQL 8.0.22, чтобы отфильтровать значения в JSON_ARRAYAGG и выводить пустой массив, если соединение возвращает значение NULL? Нужно, чтобы вместо "child": [{"id": null}]} выводило "child": []

В postgres это делается через оконную функцию FILTER:
COALESCE(JSONB_AGG(
      JSON_BUILD_OBJECT(
        'id', "cartridgeId"
      )) FILTER (WHERE "cartridgeId" IS NOT NULL), '[]') AS cartridges


SELECT
  c1.category_id,
  JSON_ARRAYAGG(JSON_OBJECT('id', c2.category_id, 'child', c2.child)) AS child
FROM oc_category c1
LEFT JOIN LATERAL (
  SELECT
    c2.category_id,
    JSON_ARRAYAGG(JSON_OBJECT('id', c3.category_id)) AS child
  FROM oc_category c2
  LEFT JOIN LATERAL (
    SELECT c3.category_id FROM oc_category c3
    where c3.parent_id = c2.category_id
    ORDER BY c3.sort_order DESC
  )
  AS c3 ON true
  where c2.parent_id = c1.category_id
  GROUP BY c2.category_id
  ORDER BY c2.sort_order DESC
)
AS c2 ON true
WHERE c1.parent_id = 0
GROUP BY c1.category_id
ORDER BY c1.sort_order


5fa1e5887cf73218714632.png
  • Вопрос задан
  • 122 просмотра
Пригласить эксперта
Ответы на вопрос 1
bogdan_uman
@bogdan_uman Автор вопроса
шлЫмазл неукЪ-поцЪ
Отвечу сам себе, нужно проверить количество записей и через условие создать пустой массив

SELECT
  c1.category_id,
  IF(count(c2.category_id), JSON_ARRAYAGG(JSON_OBJECT('id', c2.category_id, 'child', c2.child)), JSON_ARRAY()) AS child
FROM oc_category c1
LEFT JOIN LATERAL (
  SELECT
    c2.category_id,
    IF(count(c3.category_id), JSON_ARRAYAGG(JSON_OBJECT('id', c3.category_id)), JSON_ARRAY()) AS child
  FROM oc_category c2
  LEFT JOIN LATERAL (
    SELECT c3.category_id FROM oc_category c3
    where c3.parent_id = c2.category_id
    ORDER BY c3.sort_order DESC
  )
  AS c3 ON true
  where c2.parent_id = c1.category_id
  GROUP BY c2.category_id
  ORDER BY c2.sort_order DESC
)
AS c2 ON true
WHERE c1.parent_id = 0
GROUP BY c1.category_id
ORDER BY c1.sort_order
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы