2011-10-31 16 views
11

価格を保存する複数のテーブルを持つ商品データベースがあります(デフォルトの価格設定と商品の色ごとのオプションのオーバーライドが可能) *商品のオリジナル価格 *商品が販売中の場合Postgresql CASE文 - 私のSELECT内でCASEの戻り値を使用できますか?

また、販売中の商品の割引を計算する必要があります。私がこれを試す前に、動作している既存のSQLの内訳を見てください。

SELECT p.productid, p.stylename, 
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.original_price ELSE pp.original_price END AS final_original_price, 
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.sale_price ELSE pp.sale_price END AS final_sale_price 

FROM product p, ... etc. 

上記のコードが動作する(私はそれを簡略化している)、及び基本的に、製品の元の価格は、列別名「final_original_price」に格納され、(NULLであるかもしれない)販売価格は次のように返され"final_sale_price"

これで、割引を得るためにSELECTに追加の行を追加します。実際のテーブルの既存のフィールドは使用できません。なぜなら、「final_original_price」および「final_sale_price」の戻り値で計算を行う必要があるからです。

「:列ERRORは 『final_original_priceは』文字に存在しない.....」

だから、明らかに私はの戻り値を使用することはできませんPostgreSQLが返すよう上記

SELECT p.productid, p.stylename, 
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.original_price ELSE pp.original_price END AS final_original_price, 
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.sale_price ELSE pp.sale_price END AS final_sale_price, 

((final_original_price - final_sale_price)/final_original_price * 100) AS final_discount_percentage 

FROM product p, ... etc. 

、動作しません。ケース。どのソリューションを使用するのかに関する私の質問:

1)私は本当に上記のようなケースの戻り値を使用できますか? OR 2)ケースステートメントを計算に再度挿入する必要がありますか?つまり、CASEコードを繰り返す必要があり、クエリはかなり長く見えます。私がする必要があれば、私はこれをやっていますが、私はちょうど良い方法があるのだろうかと思っています。 OR 3)データベースに割引を保存するフィールドを追加することもできます。このデータは、CMSが価格が更新されるたびにフィールドが更新されることを保証する必要があるため、冗長です。しかし、バックエンドCMSよりもずっと頻繁に実行されるフロントエンドでは、重い計算(上記が重いと考えられる場合)を節約できます。

上記の解決策はおそらく最も簡単ですが、私はこれを行う時間があれば、検討する価値のある他のソリューションがありますか?例えば、これは "ビュー"を書く良いシナリオでしょうか?個人的に私はビューを設定しておらず、わかっている限り、データベース選択作業はバックグラウンドでまだ行われていますが、もし設定されていれば、エンドクエリを上記のように簡単に理解することができます。

多くの感謝!

+3

問題は「CASE」とは関係ありません。この最小限の例で分かるように、SQLの一般的な問題は、 'SELECT 42 AS x、12 AS y、x * y AS z'です。これにより、同じエラーが発生します。 –

答えて

14

使用

SELECT 
productid, 
stylename, 
final_original_price, 
final_sale_price, 
((final_original_price - final_sale_price)/final_original_price * 100) AS final_discount_percentage 
FROM 
(
SELECT p.productid, p.stylename, 
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.original_price ELSE pp.original_price END AS final_original_price, 
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.sale_price ELSE pp.sale_price END AS final_sale_price 
FROM product p, ... etc. 
) 

上記のあなたは...頼ん正確に何をしなければ、あなたはそれが、その後(ご質問からオプション2)計算にCASE文をプラグインを使用したくない何らかの理由。

+0

ブリリアント!ありがとうございました!!ここではSELECTサブクエリを使用します。 – rishijd

+0

あなたは歓迎されています:-)助けていた答えを受け入れるようにupvote/markを忘れないでください! – Yahia