Jsonb_object_keys() не возвращает никаких строк в левом соединении, если в правой боковой таблице нет совпадающих записей

#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;