#postgresql #subquery #declaration #sql-function
#postgresql #подзапрос #объявление #sql-функция
Вопрос:
Это база данных postgresql, с которой я работаю с помощью pgAdmin.
Простите меня, если это несколько общеизвестно, в частности, я новичок в postgresql … и я не нашел никаких прямых ответов в ходе предварительного поиска.
Мне интересно, есть ли простой способ реализовать аргументы start_time / end_time в качестве входных данных при выполнении запроса с использованием pgadmin и любых его встроенных функций.
Тип данных, с которым я работаю здесь, — «временная метка с часовым поясом».
Ищу какое-то направление для наилучшего способа реализации этого.
Я рассматривал возможность объявления start_time и end_time в качестве переменных, а затем использования WHERE для фильтрации на их основе, но без сторонних решений / решений прикладного уровня, есть ли способ запрашивать ввод, когда запрос выполняется внутри pgadmin?
Я ценю любые предложения — вот моя попытка заставить что-то работать, но выдает ошибку: запрос не имеет назначения для данных результата.
do $$
DECLARE
start_date timestamp := '2020-10-1';
end_date timestamp := '2020-10-5';
begin
select distinct on (account.id, menu.name, kitchen_item.name)
account.id as "Account ID",
account.firstname as "Seller First Name",
account.lastname as "Seller Last Name",
account.email as "Seller Email",
account.phone as "Seller Phone",
address.address as "Seller Address (Street)",
address.address_2 as "Seller Address 2",
account.zip_code as "Seller Zip",
address.neighborhood as "Seller Neighborhood",
menu.name as "Name of active menu",
kitchen_item.name as "Dishes",
kitchen_item.price as "Price",
kitchen_item.daily_max_orders as "Quantity",
menu.pickup_start_time as "Start time",
menu.pickup_end_time as "End time",
menu.repeat_mon as "Monday",
menu.repeat_tues as "Tuesday",
menu.repeat_wed as "Wednesday",
menu.repeat_thurs as "Thursday",
menu.repeat_fri as "Friday",
menu.repeat_sat as "Saturday",
menu.repeat_sun as "Sunday",
order_item.created as "Date of last sale"
from account
left join store on account.id = store.account_id
left join menu on store.id = menu.store_id
left join menu_item on menu.id = menu_item.menu_id
left join kitchen_item on (menu_item.kitchen_item_id = kitchen_item.id and store.id = kitchen_item.store_id)
left join orders on (orders.store_id = store.id)
left join order_item on (order_item.order_id = orders.id)
join store_address on store.id = store_address.store_id
join address on store_address.address_id = address.id
where orders.placed BETWEEN start_date AND end_date
order by account.id asc, menu.name, kitchen_item.name asc, order_item.created desc;
end $$;
Комментарии:
1. IMO забудьте о pgAdmin4 — это мусор. Мне вообще не нравится JAVA, но DBeaver может быть хорошим решением.
Ответ №1:
DO
создает анонимную функцию, которая не возвращает данных. Вы можете использовать WITH
:
WITH input (start_date, end_date) AS
(SELECT '2020-10-01'::timestamp AS start_date,
'2020-10-05'::timestamp AS end_date)
SELECT ...
FROM...
JOIN input
WHERE orders.placed BETWEEN input.start_date AND input.end_date