【发布时间】:2011-10-31 07:23:03
【问题描述】:
我有一个包含多个表的产品数据库来存储定价(因为默认定价和每个产品颜色的可选覆盖定价),并且我的查询中有 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 返回“错误:列“final_original_price”不存在于字符.....”
所以,显然我不能使用 CASE 的返回值。我对使用什么解决方案的问题:
1) 我真的可以像我想要的那样使用案例的返回值吗? 或者 2)我是否需要再次将案例语句插入我的计算中?这意味着我需要重复 CASE 代码,查询看起来会很长。如果必须,我会这样做,但我只是想知道是否有更好的方法。 或者 3)我还可以在数据库中存储一个附加字段来存储折扣。这些数据将是多余的,因为我的 CMS 需要确保在价格更新时更新该字段。然而,它会在前端节省大量计算(如果上述计算被认为是繁重的),而前端的运行比后端 CMS 更频繁。
上述解决方案可能是最简单的,但我也想知道,如果我有时间这样做,这里还有其他值得考虑的解决方案吗?例如,这是编写“视图”的好场景吗?就我个人而言,我从未设置过视图,据我了解,数据库选择工作仍在后台进行,但如果设置好了,从开发人员的角度来看,上面的最终查询会更容易理解。
非常感谢!
【问题讨论】:
-
请注意,您的问题与
CASE无关。这是 SQL 的一个普遍问题,您可以在这个最小的示例中看到:SELECT 42 AS x, 12 AS y, x*y AS z。这会产生同样的错误。
标签: postgresql