我有一個產品數據庫包含多個表來存儲定價(因爲默認定價和每種產品顏色的可選覆蓋定價),並且我在我的查詢中有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的運行頻率高,則可以節省大量計算量(如果以上情況非常嚴重)。
上述解決方案可能是最簡單的,但我也想知道,如果我有時間做到這一點,是否有任何其他解決方案值得考慮?例如,這是寫好「視圖」的好方案嗎?就我個人而言,我從來沒有設置過一個視圖,據我所知,數據庫選擇工作仍在後臺進行,但如果設置了,將會使開發人員的觀點更易於理解最終查詢。
非常感謝!
請注意,您的問題與'CASE'無關。這是一個常見的SQL問題,你可以在這個最簡單的例子中看到:'SELECT 42 AS x,12 AS y,x * y AS z'。這會產生相同的錯誤。 –