Postgresql CASE语句 - 我可以在SELECT中使用CASE的返回值吗?

ris*_*ijd 11 postgresql

我有一个产品数据库,有多个表来存储定价(由于默认定价和每种产品颜色的可选覆盖定价),我在查询中有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.
Run Code Online (Sandbox Code Playgroud)

上面的代码有效(我简化了),基本上,产品的原始价格存储在列别名"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.
Run Code Online (Sandbox Code Playgroud)

上面的方法不起作用,因为Postgresql返回"ERROR:column",final_original_price"在字符中不存在....."

所以,显然我不能使用CASE的返回值.关于使用什么解决方案的问题:

1)我可以确实使用案例的返回值,就像我想要的那样吗?或者2)我是否需要再次将case语句插入到我的计算中?这意味着我需要重复CASE代码,查询看起来会非常冗长.如果必须,我会这样做,但我只是想知道是否有更好的方法.或3)我还可以在数据库中存储一个额外的字段来存储折扣.这些数据将是多余的,因为我的CMS需要确保在更新价格时更新字段.然而,它会在前端节省大量计算(如果上面被认为很重),其运行频率远高于后端CMS.

上述解决方案可能是最简单的,但我也想知道,如果我有时间这样做,还有其他任何值得考虑的解决方案吗?例如,这是编写"视图"的好方案吗?就个人而言,我从未设置过视图,据我所知,数据库选择工作仍然在后台进行,但是,如果设置,从开发人员的角度来看,将使上面的查询更容易理解.

非常感谢!

Yah*_*hia 15

使用

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.
)
Run Code Online (Sandbox Code Playgroud)

以上内容完全符合您的要求...如果由于某种原因您不想使用它,则将CASE语句插入计算中(问题中的选项2).