SQL中实现根据finalbillvalue选择账单金额,解决列不存在报错
解决SQL中无法引用同级别SELECT别名的条件判断问题
你遇到的错误是因为SQL执行顺序限制:SELECT子句中定义的列别名,不能在同一级的SELECT或WHERE里直接引用,必须先把这些计算逻辑放到子查询中,让外层查询能访问到这些别名。
下面提供几种可行的实现方式:
方式1:使用子查询包裹原逻辑,外层做条件判断
这是最通用的方案,几乎所有SQL数据库都支持:
SELECT -- 保留你原来的其他列 ..., CASE WHEN finalbillvalue < 1 THEN billvalue ELSE finalbillvalue END AS selected_billvalue FROM ( -- 这里放你原来的完整查询,包括那两个子查询计算 SELECT ..., ( SELECT SUM(`billvalue`) FROM `dc_bills` WHERE `ordersid` = `o`.`ordersid` AND `type` = 'O' AND `type2` = 'K' ) AS `finalbillvalue`, ( SELECT SUM(`billvalue`) FROM `dc_bills` WHERE `ordersid` = `o`.`ordersid` AND `type` = 'O' AND `type2` = 'E' ) AS `billvalue` ... FROM 你的主表 o -- 替换成你实际的主表及别名 ) AS temp_query
方式2:直接在条件判断中重复子查询逻辑
如果你的查询数据量不大,或者不想嵌套子查询,可以直接在CASE里重复计算逻辑:
-- 直接替换你原来的两个子查询列,改成这个条件判断列 ... CASE WHEN ( SELECT SUM(`billvalue`) FROM `dc_bills` WHERE `ordersid` = `o`.`ordersid` AND `type` = 'O' AND `type2` = 'K' ) < 1 THEN ( SELECT SUM(`billvalue`) FROM `dc_bills` WHERE `ordersid` = `o`.`ordersid` AND `type` = 'O' AND `type2` = 'E' ) ELSE ( SELECT SUM(`billvalue`) FROM `dc_bills` WHERE `ordersid` = `o`.`ordersid` AND `type` = 'O' AND `type2` = 'K' ) END AS selected_billvalue ...
方式3:MySQL专属简化写法(用IF函数)
如果使用的是MySQL数据库,可以用IF函数替代CASE,代码更简洁:
... IF( (SELECT SUM(`billvalue`) FROM `dc_bills` WHERE `ordersid` = `o`.`ordersid` AND `type` = 'O' AND `type2` = 'K') < 1, (SELECT SUM(`billvalue`) FROM `dc_bills` WHERE `ordersid` = `o`.`ordersid` AND `type` = 'O' AND `type2` = 'E'), (SELECT SUM(`billvalue`) FROM `dc_bills` WHERE `ordersid` = `o`.`ordersid` AND `type` = 'O' AND `type2` = 'K') ) AS selected_billvalue ...
内容的提问来源于stack exchange,提问作者marcfunk
相关产品推荐
相关产品推荐

