【问题标题】:Why is this SQL giving column cannot be resolved error?为什么这个 SQL 给出的列无法解析错误?
【发布时间】:2018-12-12 03:09:51
【问题描述】:

我正在尝试运行一个非常简单的CASE...WHEN 语句:

SELECT userid, sum(end_time-start_time)/60 AS timespent_minutes, 
                    CASE WHEN webid = '324234' THEN 'CA'
                    ELSE 'Other' END AS storeloc
FROM time_spent_intervals
WHERE (ds = '2018-12-01')
GROUP BY userid, storeloc

但我收到以下错误:

错误:SYNTAX_ERROR
第 6:38 行:无法解析列“storeloc”

【问题讨论】:

  • 你确定你使用的是 MySQL 吗?
  • 你的表架构是什么?

标签: mysql sql case


【解决方案1】:

尝试重复GROUP BY中的表达式:

SELECT userid, sum(end_time-start_time)/60 AS timespent_minutes, 
       (CASE WHEN webid = '324234' THEN 'CA' ELSE 'Other' END) AS storeloc
FROM time_spent_intervals
WHERE ds = '2018-12-01'
GROUP BY userid, (CASE WHEN webid = '324234' THEN 'CA' ELSE 'Other' END) ;

虽然 MySQL 允许为 GROUP BY 使用列别名,但并非所有数据库都允许。我猜你并没有真正使用 MySQL。

【讨论】:

  • Postgres(和 Postgres 派生数据库)、MySQL、BigQuery、PresoDB 和 Hive 都允许在 GROUP BY 中使用别名。 Oracle、SQL Server、MS Access、Teradata 和 DB2 没有。
【解决方案2】:

SQL Server Query 总是按以下顺序执行查询

FROM  
WHERE 
GROUP BY 
HAVING 
SELECT 
ORDER BY

您在 GROUP BY 中引用了 SELECT 类中定义的列别名。但是 GROUP BY 将在 SELECT 语句之前执行。这就是错误的原因。以上建议的解决方案将适合您的需求。

【讨论】:

  • 这绝对不是真的。 SQL Server - 与所有数据库一样 - 按照您指定的顺序解析查询。这解释了标识符的范围规则。基本上所有的数据库都执行有向无环图,这些有向无环图是经过复杂优化后产生的,与原始查询关系不大。
猜你喜欢
  • 2021-09-03
  • 2016-03-22
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多