価格を保存する複数のテーブルを持つ商品データベースがあります(デフォルトの価格設定と商品の色ごとのオプションのオーバーライドが可能) *商品のオリジナル価格 *商品が販売中の場合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よりもずっと頻繁に実行されるフロントエンドでは、重い計算(上記が重いと考えられる場合)を節約できます。
上記の解決策はおそらく最も簡単ですが、私はこれを行う時間があれば、検討する価値のある他のソリューションがありますか?例えば、これは "ビュー"を書く良いシナリオでしょうか?個人的に私はビューを設定しておらず、わかっている限り、データベース選択作業はバックグラウンドでまだ行われていますが、もし設定されていれば、エンドクエリを上記のように簡単に理解することができます。
多くの感謝!
問題は「CASE」とは関係ありません。この最小限の例で分かるように、SQLの一般的な問題は、 'SELECT 42 AS x、12 AS y、x * y AS z'です。これにより、同じエラーが発生します。 –