关于 mysql 列别名的一个问题

2019-03-08 15:59:45 +08:00
 seraphv3

最近给公司做财务运营计费系统,需要把一个包含大量公式的 excel 转化为 mysql。excel 里面有 VLOOKUP,IF 等各种类型的公式,VLOOKUP 我用子查询实现,IF 用 CASE WHEN THEN END 实现。现在遇到这样一个问题:

SELECT *, (SELECT A FROM CIC WHERE CIC.PROJECT_ALIAS=C.PROJECT_ALIAS) AS CHARGE_MODE, CASE WHEN CHARGE_MODE='分钟' THEN F1 ELSE F2 END FROM C

这样一个 SQL 语句报错,说找不到 CHARGE_MODE。(这是简化了的 sql 示意)

也就是说想在 SELECT 后面的列中使用前面的列的别名,结果报错。不知道有没有什么的办法绕过这一问题?

实在不行只有用嵌套的 SELECT,在外层的 SELECT 中使用里层 SELECT 的列别名,但是财务的 excel 公式特别多,这样处理需要嵌套很多层,估计查询速度会很慢。

3708 次点击
所在节点    MySQL
4 条回复
Fishdrowned
2019-03-08 16:57:05 +08:00
no where, having
gz911122
2019-03-08 17:18:47 +08:00
业务逻辑挪到代码实现好了
sql 就别搞那么多骚操作了
后面的人看着都头晕
l00t
2019-03-08 17:24:39 +08:00
查询慢只会是你语句本身就慢的关系,不会是这种程度的嵌套导致的问题。写这种类型的嵌套,唯一慢的是写起来慢。

要写起来方便?建个视图吧。
ashmodeus
2019-03-08 22:53:34 +08:00
题主,建议听 2-3 楼的,用其他解决方案实现,非得 SQL,请参考我下面的野路子,仅适用 mysql。
SET @tmp := '';
SELECT *,
IF(@tmp := (SELECT A FROM CIC WHERE CIC.PROJECT_ALIAS=C.PROJECT_ALIAS), @tmp, 'error') AS CHARGE_MODE,
CASE WHEN @tmp ='分钟' THEN F1 ELSE F2 END
FROM C

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/542529

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX