9

Looks like SQL Server (tried on 2008 R2) is doing an RTRIM on columns in GROUP BY clause. Did anyone notice this? Am I missing something here?

The two selects are returning the same result set in the query below, which should not be the case I believe.

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)

Please let me know your thoughts...

4

3 に答える 3

11

実際には逆のことをしていますが、観察可能な効果は同じです。

長さが等しくない2つの文字列を比較する場合、SQL(SQL Serverだけでなく標準)の規則の1つは、短い文字列に同じ長さになるまでスペースを埋めてから、比較を実行することです。

驚かないようにするには、各文字列の最後にスペース以外の文字を追加する必要があります。


実際、標準テキストを確認すると、次の2つのオプションがあるようです。

4.6型変換とデータ型の混合

..。

長さが等しくない値を比較する場合、比較の照合シーケンスにNO PAD属性があり、短い方の値が長い方の値のプレフィックスと等しい場合、短い方の値は長い方の値よりも小さいと見なされます。比較の照合シーケンスにPAD SPACE属性がある場合、比較の目的で、右側の<space>を連結することにより、短い値が長い方の長さに効果的に拡張されます。

しかし、私が知っているSQLServerの照合はすべてですPAD SPACE

于 2012-10-11T07:44:26.833 に答える
2

これは見やすいです:

declare @t table (Name varchar(100), Age int)
  insert @t values('A', 20),('B', 30),('C', 40),('D  ', 25)
                 ,(' A', 21),('A ', 32),(' A ', 28),('D    ',10);

  select Name, Replace(Name,' ','-'),
         count(*) Count
    from @t
group by Name

--
NAME  COLUMN_1  COUNT
A     -A        2
A     A-        2
B     B         1
C     C         1
D     D--       2

A とドットの間のスペースに注意してください。0 スペースではなく 1 スペース バージョンを選択しました。
また、D グループは、末尾に 4 つではなく 2 つのスペースがあるものを選択することに注意してください。

いいえ、RTRIM を実行していません。ただし、スペースが重要な場合に混乱する可能性がある GROUP BY の結果として、2 つの列 (最初に遭遇した列) のいずれかを任意に選択するため、これはややソフトなバグです。

于 2012-10-11T08:02:28.757 に答える