Этот вопрос о Postgresql 8.3 .
У меня есть таблица с полем, содержащим такие условия, как «lastcontact is null». В коде я хочу пройтись по этой таблице и для каждой записи я хочу проверить «если условие тогда», как в этом примере:
FOR myrec IN
SELECT * FROM tabel ORDER BY colorlevel, volgnummer
LOOP
if (myrec.conditie) then
raise notice 'Condition % is true', myrec.conditie;
else
raise notice 'Condition % is false', myrec.conditie;
end if;
END LOOP;
Таблица, которую я назвал 'tabel' в этом примере:
ID | Conditie | Colorlevel | Volgnummer | Code | Description
1 | lastcontact is null | 1 | 1 | ... | ...
2 | lastchanged is null | 1 | 2 | ... | ...
3 | lastmodified is null | 1 | 3 | ... | ...
Можно ли сделать проверку, которую я желаю? Приведенный выше код приводит к следующей ошибке:
ERROR: invalid input syntax for type boolean: "lastcontact is null"
Новый раздел, содержащий результат функции Эрвина
Я использовал эту функцию:
CREATE OR REPLACE FUNCTION foo(lastcontact timestamptz)
RETURNS void AS
$BODY$
DECLARE
myrec record;
mycond boolean;
BEGIN
FOR myrec IN
SELECT * FROM tabel ORDER BY colorlevel, volgnummer
LOOP
EXECUTE 'SELECT ' || myrec.conditie || ' FROM tabel' INTO mycond;
IF mycond then
RAISE NOTICE 'Condition % is true', myrec.conditie;
ELSE
RAISE NOTICE 'Condition % is false', COALESCE(myrec.conditie, 'NULL');
END IF;
END LOOP;
END;
$BODY$
language 'plpgsql' volatile
cost 100;
Я получаю эту ошибку:
ERROR: column "lastcontact" does not exist
LINE 1: SELECT lastcontact is null FROM tabel
^
QUERY: SELECT lastcontact is null FROM tabel
CONTEXT: PL/pgSQL function "foo" line 9 at EXECUTE statement1
Я пытался найти объяснение самостоятельно, но безрезультатно. Очевидно, он пытается выполнить оператор для базы данных, но он должен понимать, что lastcontact - это переменная, заданная в качестве параметра функции.