#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 . , , Фильтрация, вероятно, должна быть в порядке. Я сомневаюсь, что функция вызывается для отфильтрованных строк.