Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите с запросом на SQL (plpgsql)

paranoy Ученик (10), на голосовании 5 месяцев назад
Привет! Есть функция в которую я переда дату, название аэропорта, город и она мне выводит инфу по рейсу
 CREATE OR REPLACE FUNCTION search_flights(sch_dep TIMESTAMP WITH TIME ZONE, air_name TEXT, cty TEXT) RETURNS TABLE ( 
"Название аэропорта" TEXT,
"Город вылета" TEXT,
"Город прилета" TEXT,
"Дата вылета" TIMESTAMP WITH TIME ZONE,
"Дата прилета" TIMESTAMP WITH TIME ZONE,
"Время перелета" INTERVAL
)
AS $$
BEGIN
RETURN QUERY
SELECT ad.airport_name->>'ru'::text AS "Название аэропорта",
ad.city->>'ru'::text AS "Город вылета",
ado.city->>'ru'::text AS "Город прилета",
f.scheduled_departure::timestamp with time zone AS "Дата вылета",
f.scheduled_arrival::timestamp with time zone AS "Дата прилета",
AGE(f.scheduled_arrival::timestamp, f.scheduled_departure::timestamp)::interval AS "Время перелета"
FROM airports_data ad
INNER JOIN flights f ON ad.airport_code = f.departure_airport
INNER JOIN airports_data ado ON f.arrival_airport = ado.airport_code
WHERE f.scheduled_departure = sch_dep AND ad.airport_name->>'ru' = air_name AND ad.city->>'ru' = cty
ORDER BY f.flight_no, f.scheduled_departure, ad.city->>'ru';
END;
$$ LANGUAGE plpgsql;

ЕЕ ВЫЗОВ:
 SELECT search_flights('2017-09-09 23:50:00-07', 'Домодедово', 'Москва') 

РЕЗУЛЬТАТ:
 (Домодедово,Москва,Братск,"2017-09-09 23:50:00-07","2017-09-10 04:55:00-07",05:05:00) 
Но она возварщает тип record и там все в одной колонке. Как сделать так что бы значения были в разных колонках и именно в тех которые я задал
 "Название аэропорта" TEXT,  
"Город вылета" TEXT,
"Город прилета" TEXT,
"Дата вылета" TIMESTAMP WITH TIME ZONE,
"Дата прилета" TIMESTAMP WITH TIME ZONE,
"Время перелета" INTERVAL
Голосование за лучший ответ
Chromatic Scale Просветленный (25997) 6 месяцев назад
Когда вы вызываете функцию PostgreSQL, которая возвращает тип TABLE, и хотите, чтобы каждый элемент возвращаемой таблицы отображался как отдельная колонка, вам нужно использовать синтаксис `SELECT * FROM` перед вызовом функции. Это гарантирует, что результаты будут представлены в виде таблицы с колонками, соответствующими определению возвращаемого типа функции, а не как один объект `record`.

В вашем случае для вызова функции и получения результатов с отображением в разных колонках, вы должны использовать следующий SQL-запрос:

```sql
SELECT * FROM search_flights('2017-09-09 23:50:00-07', 'Домодедово', 'Москва');
```

Этот синтаксис вызовет вашу функцию `search_flights` с предоставленными аргументами, а результаты будут отображаться в виде таблицы с колонками, как вы описали в возвращаемом типе функции. Таким образом, каждое значение будет находиться в своей колонке, согласно определению функции.
Сергей ИвановПросветленный (47244) 6 месяцев назад
Похоже на ChatGPT
Похожие вопросы