Sql 如何计算Postgres中select语句中的表达式

Sql 如何计算Postgres中select语句中的表达式,sql,postgresql,asp.net-mvc-4,eval,plpgsql,Sql,Postgresql,Asp.net Mvc 4,Eval,Plpgsql,Postgres 9.1+数据库包含客户和产品。 在customers表中,对于每个客户,客户价格在priceexpression列中描述为sql表达式 如何根据此数据创建价目表? 我尝试了下面的代码,但由于eval()未定义而出现错误 create table customer ( id int primary key, priceexpression text ); insert into customer values (1, 'price*0.95'),(2,'cost+12.0'

Postgres 9.1+数据库包含客户和产品。 在customers表中,对于每个客户,客户价格在priceexpression列中描述为sql表达式

如何根据此数据创建价目表? 我尝试了下面的代码,但由于eval()未定义而出现错误

create table customer
( id int primary key,
  priceexpression text );
insert into customer values (1, 'price*0.95'),(2,'cost+12.0' );

create table product
( id char(20) primary key,
   price numeric(12,4),
   cost numeric(12,4) );
insert into product values ('PRODUCT1', 120, 80),('PRODUCT2', 310.5, 290);


select
  customer.id as customer,
  product.id as product,
  eval(priceexpression) as price
 from customer,product

这是ASP.NET MVC4应用程序。

在PostgreSQL中,普通SQL无法实现这一点

您需要将动态SQL与PL/PgSQL的
EXECUTE
语句一起使用。请参阅和这里的许多关于堆栈溢出的示例

在结果集上循环,并
执行'SELECT'| |将_表达式转换为resultvar用于每行


请注意,如果没有真正运行原始SQL的任何人都可能修改price列,那么这将是一个巨大的安全漏洞。您真的不应该这样做。

您可以编写一个SQL函数来完成这项工作,并使用以下提供的函数:


但当然,它可能会很慢,不安全,您可以使用物化视图更容易地缓存它,等等-请参阅那里的docu。

谢谢。伟大的我把它标为答案并投了赞成票。我试过了,但还是出错了。我把它贴在了我更新了你问题的答案上(我并没有用你的例子亲自尝试过!)。。。您只需添加特定“dyna sql”(
产品
:cid
)所需的所有参数和表格。最好在数据中使用
:cost
而不是
{cost}
,因为它更方便、更容易理解并且不与数组语法冲突。啊。。。无法再编辑最后一条评论:-/。。。必须是
:pid
当然(而不是
:cid
)您可以删除注释,然后作为新注释再次输入。列在运行时添加到customer和product表中,表达式也在运行时创建。如何在不使用硬编码参数的情况下自动将所有列传递给eval?plpgsql有行类型,也许这可以使用基于接受的答案,这可能是可行的。我在嗯,是的,上贴了不动产问题。您将PL/PgSQ与执行一起使用。正如我上面所建议的。
select 
  c.name as cust_name,
  p.name as prod_name,
  p.cost as prod_cost,

  eval(  
    'select '||c.price_expression||' from product where id=:pid',
    '{"{cost}",:pid}',  
    array[ p.cost, p.id ]  
  )      as cust_cost

from product p,  customer c