2016-04-29 8 views
1

私は How to evaluate expression in select statement in Postgrespostgres-utils eval()エラーの修正方法:テーブル "foo"のFROM-clauseエントリがありませんか?

での回答から以下のコードを試してみましたが、修正するためにどのようにエラー

ERROR: missing FROM-clause entry for table "product" 
LINE 1: select product.price*0.95 

を得たのPostgres 9.1+でデータベースに

を格納し、価格式を評価するための方法を探しています?

多分evalをパラメータとして、顧客と製品現在の行を渡すと、evalのexpresionでそれらを使用することは可能でしょうか?

create or replace function eval(sql text) returns text as $$ 
declare 
    as_txt text; 
begin 
    execute 'select ' || sql into as_txt ; 
    return as_txt ; 
end; 
$$ language plpgsql; 


create table customer 
(id int primary key, 
    priceexpression text); 
insert into customer values (1, 'product.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 
+0

あなたの問題に対する最良の答えに投票することができればいいです:) –

+0

私はあなたの答えをマークアップして – Andrus

答えて

1

Sergは基本的権利です。 dyna-SQLは "それ自身で"として実行されるため、有効なSQL文()が必要です。すべての関連するテーブルを "知る"必要があります。これを反映するために私はupdated my answer in the referred threadです。 をより強固なこれは、よりまっすぐ進むべきである

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

、およびモジュラー:

しかし、適切にあなたの例は、(!実際にあなたが第二eval(sql text, keys text[], vals text[])バリアントを使用する必要があります)のようなものである必要があり、ここでそれを引用しますSergの提案。

+0

回答にはハードコードされた列が含まれています。顧客は、実行時に顧客テーブルと製品テーブルに新しい列を追加し、それらの列を使用する実行時に式を作成することができます。この場合、どのように使用するのですか? – Andrus

+0

@Andrus:ここで答え参照してください。http://stackoverflow.com/questions/26063328/how-to-evaluate-expression-in-select-statement-in-postgres/36909941?noredirect=1#comment61480828_36909941 –

0

テーブル名somwhereを追加するだけです。

insert into customer values (1, 'product.price*0.95 FROM product'),(2,'cost+12.0 FROM product'); 

であってもよいし、お好みで

execute 'select ' || sql || ' FROM product' into as_txt ; 

であってもよいです。

それは危険なSQLインジェクションのセキュリティホールなので、このpriceexpressionは、ユーザーにだけ管理者の制限数に露出していない希望。

+0

私はそれがテーブルのすべての行のための表現を評価することになると思います。その製品の特定の行について評価することです。 – IMSoP

+0

@IMSoP顧客と製品の現在の行をevalパラメータとして渡し、eval式でそれらを使用することは可能でしょうか?私は質問を更新しました – Andrus

+0

@Serg現在の行だけが評価される必要があります。どこの句も追加する必要がありますか? – Andrus

関連する問題