我有一个产品数据库包含多个表来存储定价(因为默认定价和每种产品颜色的可选覆盖定价),并且我在我的查询中有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'。这会产生相同的错误。 –