【问题标题】:Unknown Column name in field list (case)- MySQL字段列表中的未知列名(案例)- MySQL
【发布时间】:2019-08-13 06:14:39
【问题描述】:

我正在努力查询 mysql 数据库。以下是我整个更长查询的示例:

SELECT * ,


CASE WHEN t1.route = NULL THEN NULL ELSE left(t1.route,4) END AS node1,

CASE WHEN node1 = NULL THEN NULL ELSE CASE WHEN CHAR_LENGTH(node1) = CHAR_LENGTH(route) THEN NULL ELSE SUBSTRING(route,6,4) END END AS node2


FROM (SELECT *, [...] FROM main_db) t1;

当我在mysql workbench上运行时,出现这个错误:

Error Code: 1054. Unknown column 'node1' in 'field list'

我注意到我的代码在 TSQL 数据库上完美运行,但在 MYSQL 上却没有,我认为问题是在 mysql 执行每个操作后,它不会更新列列表,因此我无法从在同一语句中创建的列。

我之前通过在另一个查询中嵌套查询来解决此类问题,但由于我不希望有更多或更少的 14/16 嵌套查询,我正在寻找一种有效的方法来解决我的问题。

你有什么想法吗?

【问题讨论】:

  • 列别名 node1 不在其定义的同一选择列表的范围内。你需要一个派生表(子查询)!
  • CASE WHEN t1.route = NULL THEN NULL ELSE left(t1.route,4) END AS node1, 可以简化为left(t1.route,4) AS node1
  • @jarlh 好点,谢谢

标签: mysql sql tsql


【解决方案1】:

col=null 检查是不可能的你需要is null 所以它会像下面的检查部分

SELECT * ,   

CASE WHEN t1.route is NULL THEN NULL ELSE left(t1.route,4) END AS node1,

并且node1是列,不能在这里使用

您可以为此使用子查询

【讨论】:

  • 对不起,我没有写=null。我的查询没有语法错误
  • @LucaFerrario col=null 无法检查,因为 null 未定义值
【解决方案2】:

您的case 表达式没有做任何有用的事情——即使您正确使用了is null

只要做:

SELECT t1.* ,
       LEFT(t1.route, 4) as node1,
       (CASE WHEN CHAR_LENGTH(LEFT(t1.route, 4)) <> CHAR_LENGTH(route)
             THEN SUBSTRING(route, 6, 4) 
        END) AS node2
FROM (SELECT *, [...] FROM main_db) t1;

您不能在同一 SELECT 中重复使用列别名。

如果您确实想重复使用它,则将逻辑移至子查询:

SELECT t1.* ,
       (CASE WHEN CHAR_LENGTH(node1) <> CHAR_LENGTH(route)
             THEN SUBSTRING(route, 6, 4) 
        END) AS node2
FROM (SELECT *, [...],
             LEFT(t1.route, 4) as node1,
      FROM main_db
     ) t1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多