Re: Dynamic expression evaluation

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: Dynamic expression evaluation
Дата
Msg-id 19478.1068476708@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Dynamic expression evaluation  ("Philippe Lang" <philippe.lang@attiksystem.ch>)
Список pgsql-general
"Philippe Lang" <philippe.lang@attiksystem.ch> writes:
> Is there a simple way of doing "kind of" a
> SELECT *, EVAL(f) FROM public.test;

> ... and having f evaluated as an expression, so that we get back:

> ------------------------------
> id   a     b    f        eval
> ------------------------------
> 1    2     3    a+b      5
> 2    12    3    a*b      36
> 3    5     6    a+2*b    17
> ------------------------------

Not really.  You can sort of approximate eval() with plpgsql's EXECUTE:

regression=# create or replace function eval(text) returns int as '
regression'# declare res record;
regression'# begin
regression'# for res in execute ''select '' || $1 || '' as result'' loop
regression'#   return res.result;
regression'# end loop;
regression'# end' language plpgsql;
CREATE FUNCTION
regression=#  select eval ('23+34');
 eval
------
   57
(1 row)

regression=#

but this has a problem with supporting more than one result type (hmm,
maybe you could fake that with 7.4's polymorphism?).  And I don't see
any way at all for the function to have access to the other values in
the row, as your example presumes it would do.

            regards, tom lane

В списке pgsql-general по дате отправления:

Предыдущее
От: Bruno Wolff III
Дата:
Сообщение: Re: Problem Deleting Referenced records
Следующее
От: Scott Chapman
Дата:
Сообщение: Re: SQL-question: returning the id of an insert querry