SQL Server在GROUP BY期间丢弃SPACE

Fai*_*aiz 8 t-sql group-by sql-server-2008-r2

看起来像SQL Server(在2008 R2上试过)正在使用子句中的RTRIMGROUP 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)

请让我知道你的想法...

Dam*_*ver 8

它实际上正好相反,但可观察到的效果是相同的.

当比较两个不等长的字符串时,SQL的一个规则(标准,而不仅仅是SQL Server)是用较小的字符串填充空格直到它的长度相同,然后执行比较.

如果你想避免感到惊讶,你需要在每个字符串的末尾添加一个非空格字符.


事实上,检查标准文本,似乎有两种选择:

4.6键入转换和混合数据类型

...

当比较不等长度的值时,如果比较的核对序列具有NO PAD属性并且较短的值等于较长值的前缀,则认为较短的值小于较长的值.如果比较的整理顺序具有PAD SPACE属性,则为了进行比较,通过在右侧连接<space> s,较短的值有效地扩展到较长的长度.

但是我所知道的所有SQL Server排序规则都是PAD SPACE.

  • @RichardTheKiwi - 第8.2节"根据整理顺序,两个字符串可以相等,即使它们具有不同的长度或包含不同的字符序列.当操作MAX,MIN,DISTINCT时,引用分组列,UNION,EXCEPT和INTERSECT运算符引用字符串,**这些运算从一组这样的相等值中选择的特定值是依赖于实现的.**"(强调添加) (3认同)