2012-10-11 8 views
6

Sieht aus wie SQL Server (versucht auf 2008 R2) macht RTRIM auf Spalten in GROUP BY Klausel. Hat das jemand bemerkt? Fehle ich hier etwas?SQL Server verworfen SPACE während GROUP BY

Die beiden Auswahlen geben das gleiche Ergebnis zurück, das in der folgenden Abfrage gesetzt wurde. Das sollte nicht der Fall sein, der ich glaube.

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) 

Bitte lassen Sie mich Ihre Meinung wissen ...

Antwort

7

Es tut genau das Gegenteil, aber die beobachtbaren Effekte sind die gleichen.

Beim Vergleichen von zwei Strings ungleicher Länge besteht eine der Regeln von SQL (der Standard, nicht nur SQL Server) darin, dass die kürzere Zeichenfolge mit Leerzeichen aufgefüllt wird, bis sie dieselbe Länge hat, und dann wird der Vergleich ausgeführt.

Wenn Sie nicht überrascht sein möchten, müssen Sie am Ende jeder Zeichenfolge ein Leerzeichen einfügen.


In der Tat, die Überprüfung der standard text, scheint es, dass es zwei Möglichkeiten:

4,6 Typumwandlungen und Mischen von Datentypen

...

Wenn Werte von ungleiche Länge werden verglichen, wenn die Sortierfolge für den Vergleich das NO PAD Attribut und die kürzere va hat lue ist gleich einem Präfix von der längere Wert, dann wird der kürzere Wert als kleiner als der längere Wert betrachtet. Falls die Sortierreihenfolge für den Vergleich hat das PAD SPACE Attribut für die Zwecke des Vergleichs der kürzeren Wert wird auf die Länge der längeren durch Verkettung von < Raum effektiv erweitert> s auf der rechten Seite.

Aber alle SQL Server-Kollatierungen, die ich kenne, sind PAD SPACE.

+1

Nicht wirklich. Der Standard behauptet also, er passe auf die maximale Länge * zum Vergleich *, aber die Frage bezieht sich auf die Ausgabe von GROUP BY, was ** NICHT ** der längere ist, wie man es erwarten würde, wenn die Intermediäre verlängert würden (Sie sind nicht).Es ist einfach das "a" = "a" (Leerzeichen ignoriert) – RichardTheKiwi

+3

@RichardTheKiwi - Abschnitt 8.2 "Abhängig von der Sortierreihenfolge können zwei Zeichenfolgen gleich sein, auch wenn sie unterschiedlich lang sind oder Wenn die Operationen MAX, MIN, DISTINCT auf eine Gruppierungsspalte verweisen und die Operatoren UNION, EXCEPT und INTERSECT auf Zeichen strings verweisen, ** der von diesen Operationen ausgewählte spezifische Wert aus a Satz solcher gleicher Werte ist implementationsabhängig. ** "(Hervorhebung hinzugefügt) –

2

Dies ist leichter zu sehen:

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 

Beachten Sie den Raum zwischen A und Punkt. Es wählte die 1-Raum-Version über den 0-Raum. auch
Beachten Sie, dass die D-Gruppe wählt das mit zwei Leerzeichen am Ende über den 4.

So keine es keine RTRIM ausführt. Es ist so etwas wie ein aber weichen Fehler, weil es ist willkürlich eine der beiden Säulen der Wahl (die man es über die erste kam) als Ergebnis der GROUP BY, die möglicherweise Sie abwerfen könnte, wenn Räume zählte.