我正在努力查询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嵌套查询,因此我正在寻找一种解决问题的有效方法。
你有什么主意吗?
答案 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;