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

时间:2011-10-31 07:23:03

标签: 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.

以上代码有效(我简化了),基本上,产品的原始价格存储在列别名“final_original_price”中,销售价格(可能为NULL)作为“final_sale_price”返回。

我现在想在SELECT中添加一行来获得折扣。我不能使用实际表中的现有字段,因为我希望返回值“final_original_price”和“final_sale_price”来进行计算。

e.g。

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:column”,final_original_price“在字符中不存在.....”

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

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

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

非常感谢!

1 个答案:

答案 0 :(得分: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.
)

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