2011-10-31 88 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