#postgresql
#postgresql
Вопрос:
Это запрос к БД .
select users.Id,jsonb_object_keys(orders.metadata::jsonb) from users left join orders on users.userId=orders.userId where users.userId=2;
users table orders table
------------------- -----------------------------------------------------
|userId| name | | userId|orderId|metadata |
| 1 | john | | 1 | 1 | {"orderName":"chess","quantity":1}|
| 2 | doe | | 1 | 2 | {"orderName":"cube" ,"quantity":1}|
------------------- -----------------------------------------------------
Почему запрос не возвращает строк?
Ответ №1:
Очень хороший и сложный вопрос. чтобы добиться того, чего вы хотите, вы должны попробовать следующий запрос:
select
t1.userid,
t2.keys
from
users t1
left join (select userid, orderid, jsonb_object_keys(metadata) as keys from orders) t2
on t1.userid=t2.userid
Ваш запрос кажется правильным, но есть подвох. Когда вы оставите соединение обеих таблиц без jsonb_object_keys(metadata)
, оно будет работать так, как вы ожидаете. Но когда вы используете с этой функцией, эта функция вернет set of records
для каждой строки оператора select и выполнит простое объединение с остальными столбцами внутри. Вот почему он удалит строки, имеющие NULL
значение во втором столбце.
Ответ №2:
Вы должны выполнить левое соединение с результатом вызова jsonb_each():
select users.userid, meta.*
from users
left join orders on users.userid = orders.userid
left join jsonb_object_keys(orders.metadata::jsonb) as meta on true
where users.userid = 2;