【问题标题】:Execute statement provided as a value执行作为值提供的语句
【发布时间】:2015-11-19 20:30:34
【问题描述】:

我有下表:

test=# CREATE TABLE stmts(id SERIAL, selector VARCHAR(255));
CREATE TABLE
test=# INSERT INTO stmts(selector) VALUES('5 > 3'),('5 < 3');
INSERT 0 2
test=# SELECT selector FROM stmts;
 selector
----------
 5 > 3
 5 < 3
(2 rows)

我想修改 select 以便能够为每一行评估选择器的值,所以想要的效果是:

 selector, magic FROM stmts;
 selector | magic
--------------------
 5 > 3    | true
 5 < 3    | false
(2 rows)

如果这在行的上下文中执行会很棒,所以我们可以评估例如表达式id = 5等。

这可能吗?

【问题讨论】:

标签: sql database postgresql plpgsql


【解决方案1】:

您可以在 plpgsql 函数中动态执行此操作:

create or replace function eval_bool(expr text)
returns boolean language plpgsql as $$
declare
    rslt boolean;
begin
    execute format('select %s', expr) into rslt;
    return rslt;
end $$;

select id, selector, eval_bool(selector) 
from stmts;

 id | selector | eval_bool 
----+----------+-----------
  1 | 5 > 3    | t
  2 | 5 < 3    | f
(2 rows)

【讨论】:

  • 太好了,这正是我想要的!
猜你喜欢
  • 1970-01-01
  • 2021-06-19
  • 2019-01-11
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多