如果在 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 子句失败的主要内容,如果未能解决你的问题,请参考以下文章
如果在 IOCP 模型中指定了 WSASend 的 lpCompletionRoutine 怎么办?