#postgresql
Вопрос:
do
$
declare
f record;
begin
for f in SELECT DISTINCT station_code FROM rainfall LIMIT 3
loop
EXECUTE format('SELECT * FROM rainfall WHERE station_code=''%I''', f.station_code);
RAISE NOTICE '%',f.station_code;
end loop;
end;
$
Привет, я пытаюсь распечатать инструкцию execute для каждого кода f.station_code. Он не возвращает никаких выходных данных, но не выдает ошибок. Однако уведомление о повышении возвращается
NOTICE: MALUDAM
NOTICE: IGAN
NOTICE: LUBOKANTU
DO
Query returned successfully in 4 secs 4 msec.
Ценю любую оказанную помощь.
Ответ №1:
do
Блок не может вернуть результат.
Но я не вижу никаких причин использовать для этого PL/pgSQL, цикл или даже динамический SQL:
Один запрос, подобный следующему, сделает то, что вы хотите:
SELECT *
FROM rainfall
WHERE station_code IN (SELECT station_code FROM rainfall LIMIT 3);
(Хотя ВХОД с ОГРАНИЧЕНИЕМ на одной и той же таблице имеет для меня нулевой смысл)
Комментарии:
1. Привет, спасибо, что ответили. На самом деле я хотел добавить СЧЕТЧИК и СГРУППИРОВАТЬ ПО в запросе в ВЫПОЛНИТЬ, но я использовал более общий запрос для отладки, потому что я не мог заставить f.station_code вставляться в %I. Я понимаю, что можно использовать вложенный цикл, но я был бы признателен, если бы вы помогли мне понять, как я мог бы заставить работать случай цикла for, поскольку я нахожу его более интуитивным, чем вложенные запросы. Спасибо.
2. @SidiqMK: еще раз:
do
блок не может вернуть результат. Так что то, чего вы пытаетесь достичь, невозможно. И цикл PL/pgSQL для-самый неэффективный способ сделать это. Дополнительный выбор намного эффективнее и будет масштабироваться намного лучше.3. @SidiqMK Цикл for очень редко требуется в SQL и должен рассматриваться как последнее средство. Вам будет гораздо лучше, если вы научитесь писать запросы, включающие наборы данных.