Как правильно объединить несколько json_group_array для этого запроса?

Мой агрегатный запрос с group_concat выбирает из одной таблицы, а если результатов нет, он выбирает из другой:

SELECT
    Col1,
    Col2,
    IFNULL(
        SELECT group_concat(SomeColumn) FROM RelationOne,
        SELECT group_concat(SomeColumn) FROM RelationTwo)
FROM MainTable

В результате получается список, разделенный запятыми, из RelationOne или RelationTwo. Вместо этого я хочу использовать json_group_array:

SELECT
    Col1,
    Col2,
    IFNULL(
        SELECT json_group_array(SomeColumn) FROM RelationOne,
        SELECT json_group_array(SomeColumn) FROM RelationTwo)
FROM MainTable

При этом создается массив JSON со значениями из RelationOne, но если RelationOne нет данных, он создает пустой массив [] вместо NULL, поэтому, если есть какие-либо значения из RelationTwo, они никогда не будут показаны, потому что [] != NULL.

Как мне это сделать правильно?

🤔 А знаете ли вы, что...
Существует множество различных реляционных баз данных, таких как MySQL, PostgreSQL, Oracle и Microsoft SQL Server, которые используют SQL, но могут иметь свои особенности.


53
1

Ответ:

Решено

Добавьте having count() > 0 в свой подзапрос, чтобы он не возвращал строк, если нет значений. (Да, работаю без группы.)

Вот пример:

with numbers(x) as (values (1), (2), (3))
select
  ifnull(
    (select json_group_array(x) from numbers b where b.x < a.x),
    'None'
  )
from numbers a;

Выход:

[]
[1]
[1,2]

Теперь добавляю having count() > 0:

with numbers(x) as (values (1), (2), (3))
select
  ifnull(
    (select json_group_array(x) from numbers b where b.x < a.x having count() > 0),
    'None'
  )
from numbers a;

Новый результат:

None
[1]
[1,2]