powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / контроль колонок при формировании JSON ответа
11 сообщений из 11, страница 1 из 1
контроль колонок при формировании JSON ответа
    #39064267
Фотография chernomyrdin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,

Тут столкнулся с небольшой проблемой, чувствую что решение очень простое, но туплю.
Есть данные:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create table site_order (
	id bigint,
	status int,
	phone text
);
create table site_order_item (
	id bigint,
	order_id bigint,
	name text,
	amount int,
	cost real
);
insert into site_order values
	(1,1,'+7 (000) 000-00-01'),
	(2,2,'+7 (000) 000-00-02');
insert into site_order_item values
	(1,1,'Водка',1,130.00),
	(2,1,'Туалетная бумага',2,60.00),
	(3,2,'Пиво',5,20.00),
	(4,2,'Чипсы',2,50.00);



Запрашиваем данные:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with o as (
	select id,status,phone
	from site_order 
	where id in (1,2)
), i as (
	select t.order_id,json_agg(row_to_json(t)) as items
	from (
		select order_id,name,amount,cost
		from site_order_item
		where order_id in (select id from o)
	) as t
	group by t.order_id
)
select json_agg(row_to_json(t)) from (
	select o.*,i.items from o left join i on (i.order_id = o.id)
) as t



Получаю ответ:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
[
  {
    "id": 1,
    "status": 1,
    "phone": "+7 (000) 000-00-01",
    "items": [
      {"order_id": 1, "name": "Водка", "amount": 1, "cost": 130},
      {"order_id": 1, "name": "Туалетная бумага", "amount": 2, "cost": 60}
    ]
  },
  {
    "id": 2,
    "status": 2,
    "phone": "+7 (000) 000-00-02",
    "items": [
      {"order_id": 2, "name": "Пиво", "amount": 5, "cost": 20},
      {"order_id": 2, "name": "Чипсы", "amount": 2, "cost": 50}
    ]
  }
]



Собственно вопрос как удалить поле "order_id" из элементов массива "items"
...
Рейтинг: 0 / 0
контроль колонок при формировании JSON ответа
    #39064284
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chernomyrdin,

собственно се селектить order_id
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with o as (
	select id,status,phone
	from site_order 
	where id in (1,2)
), i as (
	select t.order_id,json_agg(row_to_json(t)) as items
	from (
		select order_id,name,amount,cost
		from site_order_item
		where order_id in (select id from o)
	) as t
	group by t.order_id
)
select json_agg(row_to_json(t)) from (
	select o.status, o.phone,i.items from o left join i on (i.order_id = o.id)
) as t
...
Рейтинг: 0 / 0
контроль колонок при формировании JSON ответа
    #39064372
Фотография chernomyrdin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lonepsycho,

Да нет, дело в том что внутри items мне order_id не нужен, а снаружи нужен :-)
То есть умом понимаю что нужно переделать

Код: plsql
1.
2.
3.
4.
5.
6.
7.
select t.order_id, json_agg(row_to_json(t)) as items
from (
	select order_id,name,amount,cost
	from site_order_item
	where order_id in (select id from o)
) as t
group by t.order_id



что-бы row_to_json(t) не добавлял order_id в список того что сорбирает json_agg()
...
Рейтинг: 0 / 0
контроль колонок при формировании JSON ответа
    #39064505
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chernomyrdin,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with o as (
	select id,status,phone
	from site_order 
	where id in (1,2)
), i as (
	select t.order_id, json_agg(json_build_object('name', name, 'amount', amount, 'cost', cost) ) as items
	from (
		select order_id,name,amount,cost
		from site_order_item
		where order_id in (select id from o)
	) as t
	group by t.order_id
)
select json_agg(row_to_json(t)) from (
	select o.*,i.items from o left join i on (i.order_id = o.id)
) as t;

не?
...
Рейтинг: 0 / 0
контроль колонок при формировании JSON ответа
    #39064531
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lonepsycho,

я так понимаб -- за имена ключей боретесь ?

Код: sql
1.
2.
3.
4.
5.
6.
7.
WITH t (id,a,b) AS (VALUES 
(1,1,1)
,(2,2,2)
,(3,3,3)
)  -- так имен нет
,t1 AS  (SELECT * FROM t) -- а так --есть
SELECT json_agg( (SELECT row_to_json( foo ) FROM (SELECT t1.a,t1.b) foo)) FROM t1




-- "это невозможно понять, это надо запомнить" (сс)
...
Рейтинг: 0 / 0
контроль колонок при формировании JSON ответа
    #39064539
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

почти что, но не совсем. там надо из агрегата убрать одно поле, оставив его снаружи, для груповухи...
...
Рейтинг: 0 / 0
контроль колонок при формировании JSON ответа
    #39064544
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
куда--то в ту степь , не очевидно , нет :
chernomyrdinLonepsycho,

Да нет, дело в том что внутри items мне order_id не нужен, а снаружи нужен :-)
То есть умом понимаю что нужно переделать

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
-- у тебя вода в рот попадает ?
-- не-а 
select t.order_id, json_agg(-- а у меня -- попадает
					(SELECT row_to_json(foo) FROM (SELECT t.name,t.amount,t.cost) AS FOO)
					) as items
from (
	select order_id,name,amount,cost
	from site_order_item
	where order_id in (select id from o)
) as t
group by t.order_id



что-бы row_to_json(t) не добавлял order_id в список того что сорбирает json_agg()
...
Рейтинг: 0 / 0
контроль колонок при формировании JSON ответа
    #39064556
Фотография chernomyrdin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lonepsycho,

Почти то что нужно, правда там 9.3, и как следствие json_build_object() не находит ;-(
А по другому можно как-нибудь?
...
Рейтинг: 0 / 0
контроль колонок при формировании JSON ответа
    #39064560
Фотография chernomyrdin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

Спасибо, это то что нужно.
...
Рейтинг: 0 / 0
контроль колонок при формировании JSON ответа
    #39064563
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

ну да, не вникал в представленный образец.
...
Рейтинг: 0 / 0
контроль колонок при формировании JSON ответа
    #39064801
crause
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вместо row_to_json использую to_json
row_to_json при некоторых SELECT может затирать названия колонок.

жду 9.5 версию там несколько удобных плюшек по работе с JSONB
слияние объектов удаление пар из объекта.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / контроль колонок при формировании JSON ответа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]