Задать вопрос
@Exzyggwp

Select in JSON Object?

Всем привет, помогите кто знает..

Есть функция PL\SQL на подобии этого
FUNCTION myfunc(p_id varchar2) return in number
BEGIN

    SELECT t_id, t_name, t_phone FROM clients where t_id = p_id;

    SELECT t_id, t_name, t_phone FROM trainers where t_id < p_id;       

    RETURN;

END myfunc;


Первый Select возвращает только одну строку данных, а второй Select несколько строк данных.

Нужно сделать так чтобы данные первого select записывались как объект JSON,
А данные второго select записывались как массив JSON который принадлежит к объекту.

Примерно так,
Json_obj(Value1, Value2, json_arr);

Всё эту нужно для того чтобы возвращать эти данные при вызове. (return)
А функция может возвращать только одно значение, из за этого важно что json_arr был как один из элементов json_obj.
  • Вопрос задан
  • 361 просмотр
Подписаться 1 Средний Комментировать
Решения вопроса 1
rozhnev
@rozhnev
Fullstack programmer, DBA, медленно, дорого
Ниже вариант запроса (PostgreSQL) который собирает всё в один JSON:
SELECT row_to_json(client.*)
FROM (
  SELECT 
	clients.*,
	json_agg(
	  row_to_json(trainers.*)
	) trainers
  FROM 
	clients 
  JOIN trainers ON trainers.t_id < clients.t_id
  where 
	clients.t_id = 10
  GROUP BY clients.t_id, clients.t_name, clients.t_phone
) client;


SQL fiddle

Вариант PL\SQL:
SELECT json_object(
      't_id' VALUE client.t_id,
      't_name' VALUE client.t_name,
      't_phone' VALUE client.t_phone,
      't_trainers' VALUE client.trainers
  ) FROM (
  SELECT 
  clients.*,
  json_arrayagg(json_object(
      't_id' VALUE trainers.t_id,
      't_name' VALUE trainers.t_name,
      't_phone' VALUE trainers.t_phone
  )) trainers
  FROM 
	clients 
  JOIN trainers ON trainers.t_id < clients.t_id
  where 
	clients.t_id = 10
  GROUP BY clients.t_id, clients.t_name, clients.t_phone
  ) client;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Exzyggwp Автор вопроса
Это вообще возможно?
Или есть другие способы?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы