字段列表中的未知列名(大小写)-MySQL

时间:2019-03-22 09:30:20

标签: mysql sql tsql

我正在努力查询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工作台上运行它时,出现此错误:

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

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

我以前通过在另一个查询中嵌套查询来解决此类问题,但是由于我不想或多或少地使用14/16嵌套查询,因此我正在寻找一种解决问题的有效方法。

你有什么主意吗?

2 个答案:

答案 0 :(得分:0)

col =null检查是不可能的,您需要is null,所以下面将要检查零件

SELECT * ,   

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

并且node1是一栏,不能在此使用

您可以为此使用子查询

答案 1 :(得分:0)

即使正确使用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;