有没有办法在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 :param1replace为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');