2012-10-11 1 views
6

GROUP BY節の列でRTRIMを実行しているSQL Server(2008 R2で試行)のように見えます。誰かがこれに気づいたか?私はここに何かを逃していますかGROUP BY中にSPACEを破棄するSQL Server

以下のクエリでは、2つの選択肢が同じ結果セットを返していますが、これは私が信じるものではありません。私は自分の考えをお聞かせください

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) 

...

答えて

7

は実際に反対のことをやっているが、観測可能な効果は同じです。

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

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

4.6型変換とデータ型

の混合...

値の:


実際には、standard textチェック、二つの選択肢があることが表示されます比較のための照合順序が NO PAD属性であり、より短いvaである場合には、不等長さ が比較されるlueが接頭辞「 」に等しい場合、より短い値は、より長い値「 」よりも小さいとみなされます。比較の照合順序が の場合、比較の目的で の値は、 の長さまで有効に延長され、右側の<のスペースが連結されます。

私が知っているすべてのSQL Serverの照合順序はPAD SPACEです。

+1

したがって、標準では比較*のために最大長*に詰まると主張していますが、質問はGROUP BYの出力に関するものです。** NOT ** **仲介者が長くなった(彼らはそうではありません)。 – RichardTheKiwi

+3

@RichardTheKiwi - セクション8.2「照合シーケンスによっては、2つの文字列が異なる長さであっても同じ文字列である可能性があります。 MAX、MIN、DISTINCT、グループ化列への参照、およびUNION、EXCEPT、およびINTERSECT演算子が 文字列を参照している場合**これらの操作によって選択された特定の値は aそのような等しい値のセットはインプリメンテーション依存です。** "(強調が追加されました) –

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を行っていません。 softバグですが、任意にの2つのカラムのうちの1つを選択すると、スペースが重要な場合には、あなたを捨てる可能性があります。