Fai*_*aiz 8 t-sql group-by sql-server-2008-r2
看起来像SQL Server(在2008 R2上试过)正在使用子句中的RTRIM列GROUP BY.有没有人注意到这个?我在这里错过了什么吗?
这两个选择在下面的查询中返回相同的结果集,这不应该是我认为的情况.
declare @t table(Name varchar(100), Age int)
insert into @t values ('A', 20)
insert into @t values ('B', 30)
insert into @t values ('C', 40)
insert into @t values ('D', 25)
insert into @t values (' A', 21)
insert into @t values ('A ', 32)
insert into @t values (' A ', 28)
select
Name,
count(*) Count
from @t
group by Name
select
rtrim(Name) RtrimmedName,
count(*) Count
from @t
group by rtrim(Name)
Run Code Online (Sandbox Code Playgroud)
请让我知道你的想法...
它实际上正好相反,但可观察到的效果是相同的.
当比较两个不等长的字符串时,SQL的一个规则(标准,而不仅仅是SQL Server)是用较小的字符串填充空格直到它的长度相同,然后执行比较.
如果你想避免感到惊讶,你需要在每个字符串的末尾添加一个非空格字符.
事实上,检查标准文本,似乎有两种选择:
4.6键入转换和混合数据类型
...
当比较不等长度的值时,如果比较的核对序列具有
NO PAD属性并且较短的值等于较长值的前缀,则认为较短的值小于较长的值.如果比较的整理顺序具有PAD SPACE属性,则为了进行比较,通过在右侧连接<space> s,较短的值有效地扩展到较长的长度.
但是我所知道的所有SQL Server排序规则都是PAD SPACE.