2011-10-31 92 views
11

我有一個產品數據庫包含多個表來存儲定價(因爲默認定價和每種產品顏色的可選覆蓋定價),並且我在我的查詢中有CASE語句以獲得 *產品的原始價格 *銷售價格該產品,如果它正在出售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」的返回值執行計算。

例如

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. 

以上不工作,到了PostgreSQL返回「ERROR:列‘final_original_price’根本不存在的人物......」

因此,很明顯,我不能使用的返回值案子。我的問題是使用什麼解決方案:

1)我真的可以像上面那樣使用我想要的情況的返回值嗎? 或 2)我是否需要再次將case語句插入到我的計算中?這意味着我需要重複CASE代碼,並且查詢看起來會很漫長。如果必須,我會這樣做,但我只是想知道是否有更好的方法。 或 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. 
) 

上面做了你問的...到底是什麼如果你不想用那麼插件CASE報表計算進去(選項2從你的問題)的一些理由。

+0

太棒了!謝謝!!現在我將使用SELECT子查詢。 – rishijd

+0

歡迎您:-)請不要忘記將upvote/mark標記爲已接受任何有幫助的答案! – Yahia