有没有办法在PostgreSQL中的string值(如eval)内执行查询?
我想这样做:
SELECT (EVAL 'SELECT 1') + 1;
在PostgreSQL中有没有办法像这样( EVAL
)?
如果您试图“eval”的语句总是返回相同的数据types,则可以编写一个使用Grzegorz提到的EXECUTE的eval()函数。
create or replace function eval(expression text) returns integer as $body$ declare result integer; begin execute expression into result; return result; end; $body$ language plpgsql
那么你可以做类似的事情
SELECT eval('select 41') + 1;
但是,如果您的dynamic语句为您要评估的每个expression式返回不同的内容,则此方法将不起作用。
另外请记住,这会通过运行任意的语句而带来巨大的安全风险。 如果这是一个问题取决于你的环境。 如果这只用于交互式SQL会话,那么这不是一个问题。
笔记
语言PLpgSQL的语法有很多种说法:
Y := f(X);
EXECUTE
子句仅用于“dynamic执行”( 性能较低 ),
EXECUTE 'f(X)' INTO Y;
使用Y := f(X);
或者SELECT
执行静态声明,
SELECT f(X) INTO Y;
丢弃结果或使用void返回时使用PERFORM语句:
PERFORM f(X);
我会去数据types的文本,因为它是更灵活的使用铸造运营商如::int
如果需要的话:
create or replace function eval( sql text ) returns text as $$ declare as_txt text; begin if sql is null then return null ; end if ; execute sql into as_txt ; return as_txt ; end; $$ language plpgsql -- select eval('select 1')::int*2 -- => 2 -- select eval($$ select 'a'||1||'b' $$) -- => a1b -- select eval( null ) -- => null
我还添加了这个和另一个支持一些自定义键值replace的eval( sql, keys_arr, vals_arr )
函数, 例如:handy :param1
replace为postgres-utils
我不知道它是否适合你,但PostgreSQL有EXECUTE
语句。
好主意。 您可以修改以执行直接expression式:
create or replace function eval(expression text) returns integer as $body$ declare result integer; begin execute 'SELECT ' || expression into result; return result; end; $body$ language plpgsql;
要运行只需键入这个:
SELECT eval('2*2');