如果在 select 中指定了大写,则 Order by 子句失败

Posted

技术标签:

【中文标题】如果在 select 中指定了大写,则 Order by 子句失败【英文标题】:Order by clause fails if upper case specified in select 【发布时间】:2016-11-15 23:54:04 【问题描述】:

我有一个类似的查询:

SELECT DISTINCT UPPER(LEFT(title, 1)) as title
 FROM <table_name>
 ORDER BY LEFT(title, 1);

失败并出现错误

#3065 - ORDER BY 子句的表达式 #1 不在 SELECT 列表中,引用列 'title' 不在 SELECT 列表中;这与 DISTINCT 不兼容

当使用 UPPER 按顺序按 ORDER BY UPPER(LEFT(title, 1)); 时,这可以正常工作

我想知道为什么它之前会失败,因为默认情况下 order by 不区分大小写我猜这里提到http://dev.mysql.com/doc/refman/5.7/en/sorting-rows.html

我在 MySQL 5.7+ 上启用了所有默认 sql_modes

【问题讨论】:

【参考方案1】:

我认为错误信息很清楚。出现错误是因为title 可以引用表中的列或列别名。搜索首先查找该列,因此查询被解释为:

SELECT DISTINCT UPPER(LEFT(t.title, 1)) as title
FROM <table_name> t
ORDER BY LEFT(t.title, 1);

我认为您可以通过使用不同的别名来解决此问题:

SELECT DISTINCT UPPER(LEFT(t.title, 1)) as new_title
FROM <table_name> t
ORDER BY LEFT(new_title, 1);

【讨论】:

是的,这行得通,但是如果我在上面的查询中有不同的别名(比如说title_alias) - 它会失败:(。我仍然必须在我的订单子句中提到UPPER(LEFT(title, 1)) . 我能知道为什么这不适用于LEFT(title, 1) 别名不同的原因吗? is order by 与 select 语句中选择的案例有关? @jitendrapurohit 。 . .我想我用别名解释了这个问题——它与列名混淆了,列名优先。

以上是关于如果在 select 中指定了大写,则 Order by 子句失败的主要内容,如果未能解决你的问题,请参考以下文章

Oracle order by 处理NULL值

order by用法

如果在 IOCP 模型中指定了 WSASend 的 lpCompletionRoutine 怎么办?

Nulls first和nulls last

在应使用条件的上下文(在 'where' 附近)中指定了非布尔类型的表达式。 关键字 'order' 附近有语法错误。

sql中select语句的执行过程,其中WHERE CONDITION子句中指定了相同的表名