Мой агрегатный запрос с 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, но могут иметь свои особенности.
Добавьте 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]