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

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

paranoy Новичок (0), открыт 3 недели назад
Привет! Есть функция в которую я переда дату, название аэропорта, город и она мне выводит инфу по рейсу
 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
1 ответ
Chromatic Scale Просветленный (21916) 3 недели назад
Когда вы вызываете функцию PostgreSQL, которая возвращает тип TABLE, и хотите, чтобы каждый элемент возвращаемой таблицы отображался как отдельная колонка, вам нужно использовать синтаксис `SELECT * FROM` перед вызовом функции. Это гарантирует, что результаты будут представлены в виде таблицы с колонками, соответствующими определению возвращаемого типа функции, а не как один объект `record`.

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

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

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