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应用程序。
答案 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
但当然它可能很慢,不安全,你可以使用物化视图来更容易地缓存它等等 - 请参阅那里的文档。