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

时间:2014-09-26 15:40:55

标签: 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' );

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应用程序。

2 个答案:

答案 0 :(得分:1)

在PostgreSQL中使用纯SQL无法做到这一点。

您需要在PL / PgSQL的EXECUTE语句中使用动态SQL。请参阅堆栈溢出中的PL/PgSQL和许多示例。

循环结果集,每行EXECUTE 'SELECT '||the_expression INTO resultvar;

请注意,如果没有被运行原始SQL的任何人可以修改价格列,这是一个巨大的安全漏洞。你真的不应该这样做。

答案 1 :(得分:1)

您可以编写一个SQL函数来为您执行此操作并使用例如随postgres-utils提供的那些:

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

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