我有一个产品数据库有多个表来存储定价(由于默认定价和每个产品颜色可选的覆盖定价),我在查询中有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,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:column”final_original_price“不存在于字符…..”
所以,显然我不能使用CASE的返回值.我关于使用什么解决方案的问题:
1)我可以使用我想要的案例的返回值吗?
要么
2)我需要再次将case语句插入到我的计算中吗?这意味着我需要重复CASE代码,并且查询看起来相当冗长.如果我必须,我会这样做,但我只是想知道是否有更好的方法.
要么
3)我还可以在数据库中存储一个额外的字段来存储折扣.这些数据将是多余的,因为我的CMS需要确保在更新价格时更新该字段.然而,它将节省大量计算(如果上述被认为很重),前端运行比后端CMS更频繁.
以上解决方案可能是最简单的,但是我也想知道,如果我有时间这样做,这里有其他的解决方案值得考虑吗?例如,这是写一个“视图”的好方法吗?就我个人而言,我从来没有设置过,据我所知,数据库选择工作仍然在后台进行,但是如果设置了,那么从开发人员的角度来看,上面的结尾查询可以更容易理解.
非常感谢!
@H_301_29@@H_301_29@
使用
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,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).
@H_301_29@