sql - 执行作为值提供的语句

标签 sql database postgresql plpgsql

我有下表:

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

这可能吗?

最佳答案

您可以在 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)

关于sql - 执行作为值提供的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33813809/

相关文章:

java - 无法使用 LIKE 从 PostgreSQL 选择 Unicode 数据

postgresql - 如何使用 JOOQ 将 Postgres "infinity"插入时间戳字段?

SQL 语句。需要帮助理解它

python - Flask-SQLAlchemy 检查数据库中是否存在表

php - 如何获取插入查询的结果

mysql select 抛出错误为“无法写入”;表中的重复键

node.js - 在 Sequelize 操作之后关闭我的连接是一个好习惯吗?

mysql - 从 MySQL 迁移到 PostgreSQL 时 Django 用户应该知道什么?

sql - 比较sql表中的行

javascript - 使用原始 Sequelize 查询 : avoiding single quotes? 的替换