MsSQL   发布时间:2022-05-16  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了sql – 为什么我不能使用CASE在ORDER BY中引用列别名?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
对不起,如果这是一个重复,但我还没有找到一个.当我使用CASE时,为什么我不能使用ORDER BY中的SELECT中定义的列别名?

虑这个简单的查询:

SELECT NewValue=CASE WHEN Value IS NULL THEN '<Null-Value>' ELSE Value END
FROM dbo.TableA
ORDER BY CASE WHEN NewValue='<Null-Value>' THEN 1 ELSE 0 END

结果是一个错误:

Here’s a sql-fiddle.(将ORDER BY NewValue替换为CASE WHEN …被注释掉)

我知道在这种情况下,我可以使用ORDER BY CASE WHEN值IS NULL THEN 1 ELSE 0 END,但实际上查询更复杂,我希望尽可能地保持可读性.我是否必须使用子查询或CTE,如果是这样的话呢?

更新为Mikael Eriksson已经评论过任何表达式与别名组合是不允许的.所以即使这样(无意义的查询)也出于同样的原因:

SELECT '' As Empty
FROM dbo.TableA
ORDER BY Empty + ''

结果:

所以ORDER BY中允许一个别名,也可以是一个表达式,而不是两者.为什么呢实施起来太难了?因为我主要是一个程序员,我认为别名可以简单的用在表达式中.

解决方法

这与sql dbms如何解析歧义名称有关.

我还没有在sql标准中跟踪这种行为,但是它似乎在平台之间是一致的.这是发生了什么

create table test (
  col_1 Integer,col_2 Integer
);

insert into test (col_1,col_2) values 
(1,3),(2,2),(3,1);

别名“col_1”为“col_2”,并使用ORDER BY子句中的别名. dbms将ORDER BY中的“col_2”解析为“col_1”的别名,并按“test”“col_1”中的值进行排序.

SELEct col_1 as col_2
from test
order by col_2;
col_2
--
1
2
3

别名“col_1”为“col_2”,但在ORDER BY子句中使用一个表达式. dbms解析“col_2”不是“col_1”的别名,而是列“test”“col_2”.它按“test”,“col_2”的值进行排序.

SELEct col_1 as col_2
from test
order by (col_2 || '');
col_2
--
3
2
1

所以在你的情况下,您的查询失败,因为dbms想要将表达式中的“NewValue”解析为基表中的列名.但不是它是列别名.

POSTGResql的

这个行为在PostgreSQl的SorTing Rows节中被记录了.他们的理由是减少歧义.

SELECT a + b AS sum,c FROM table1 ORDER BY sum + c;          -- wrong

sql Server 2008中的文档错误

与aliases in the ORDER BY clause有个不同的问题.

除非我没有足够的咖啡因,这根本不是真的.此语句在sql Server 2008和sql Server 2012中都以“test”.“col_1”排序.

SELEct col_1 as col_2
from test
order by col_1;

大佬总结

以上是大佬教程为你收集整理的sql – 为什么我不能使用CASE在ORDER BY中引用列别名?全部内容,希望文章能够帮你解决sql – 为什么我不能使用CASE在ORDER BY中引用列别名?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:对不起