【问题标题】:Postgresql CASE statement - can I use the return value of the CASE within my SELECT?Postgresql CASE 语句 - 我可以在我的 SELECT 中使用 CASE 的返回值吗?
【发布时间】: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


【解决方案1】:

使用

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)。

【讨论】:

  • 太棒了!谢谢!!我现在将使用 SELECT 子查询。
  • 不客气 :-) 请不要忘记投票/标记为已接受任何有帮助的答案!
猜你喜欢
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 2011-02-24
  • 2022-01-17
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多