› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
seraphv3
V2EX  ›  MySQL

关于 mysql 列别名的一个问题

  •  
  •   seraphv3 · Mar 8, 2019 · 4814 views
    This topic created in 2767 days ago, the information mentioned may be changed or developed.

    最近给公司做财务运营计费系统,需要把一个包含大量公式的 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 公式特别多,这样处理需要嵌套很多层,估计查询速度会很慢。

    4 replies  •  2019-03-08 22:53:34 +08:00
    Fishdrowned
        1
    Fishdrowned  
       Mar 8, 2019
    no where, having
    gz911122
        2
    gz911122  
       Mar 8, 2019
    业务逻辑挪到代码实现好了
    sql 就别搞那么多骚操作了
    后面的人看着都头晕
    l00t
        3
    l00t  
       Mar 8, 2019
    查询慢只会是你语句本身就慢的关系,不会是这种程度的嵌套导致的问题。写这种类型的嵌套,唯一慢的是写起来慢。

    要写起来方便?建个视图吧。
    ashmodeus
        4
    ashmodeus  
       Mar 8, 2019
    题主,建议听 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
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   728 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:25 · PVG 05:25 · LAX 14:25 · JFK 17:25
    ♥ Do have faith in what you're doing.