Как установить псевдоним для столбцов, полученных с помощью jsonb_to_recordset?

#sql #postgresql #eloquent

#sql #postgresql #красноречивый

Вопрос:

У меня есть столбец «телефон», который содержит массив объектов. Например

 [
   {
     "id": 8789789789,
     "phone": "111111111",
     "default": true,
     "code": "11",
     "country_code": "US"
   }
]
  

Мне нужно объединить некоторые значения из одного из объектов в этом массиве, поэтому я использую jsonb_to_recordset с поперечным соединением для этого

 select * 
from "phones" cross join lateral 
     jsonb_to_recordset(phone) as r(phone jsonb, country_code jsonb)
 where "r.country_code" = ? and "deleted_at" is null
  

Проблема здесь в том, что извлеченный телефон (из объекта) перезаписывает начальный телефонный столбец с помощью json. Как я могу установить псевдонимы для объединенных столбцов, чтобы они не перезаписывали исходный столбец?

Ответ №1:

Вы можете предоставить им новые псевдонимы:

 select p.*,
       r.phone as r_phone,
       r.r_country_code as r_country_code
from "phones" p cross join lateral 
     jsonb_to_recordset(phone) as r(phone jsonb, country_code jsonb)
 where "country_code" = ? and "deleted_at" is null
  

Комментарии:

1. большое спасибо! Я также хотел бы спросить, можно ли использовать оператор ‘where’ внутри моего бокового соединения? Таким образом, он будет присоединяться только к записи, где country_code имеет значение, которое мне нужно, или null (в данный момент он присоединяется к каждому объекту внутри массива)

2. @rusyko . , , Фильтрация, вероятно, должна быть в порядке. Я сомневаюсь, что функция вызывается для отфильтрованных строк.