加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 16:32:53 所属栏目:百科 来源:网络整理
导读:我有一个产品数据库有多个表来存储定价(由于默认定价和每个产品颜色可选的覆盖定价),我在查询中有CASE语句来获取 *产品的原价 *销售价格的产品,如果是出售 如果产品出售,我还需要计算折扣.在尝试这之前,请看我现有SQL的细节. SELECT p.productid,p.stylename
我有一个产品数据库有多个表来存储定价(由于默认定价和每个产品颜色可选的覆盖定价),我在查询中有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,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更频繁.

以上解决方案可能是最简单的,但是我也想知道,如果我有时间这样做,这里有其他的解决方案值得考虑吗?例如,这是写一个“视图”的好方法吗?就我个人而言,我从来没有设置过,据我所知,数据库选择工作仍然在后台进行,但是如果设置了,那么从开发人员的角度来看,上面的结尾查询可以更容易理解.

非常感谢!

使用
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,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).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读