2012-10-11 41 views
6

Có vẻ như SQL Server (đã thử trên 2008 R2) đang thực hiện một số RTRIM trên các cột trong mệnh đề GROUP BY. Có ai để ý điều này không? Am i thiếu cái gì ở đây?SQL Server loại bỏ SPACE trong GROUP BY

Hai lựa chọn sẽ trả lại cùng một tập hợp kết quả trong truy vấn bên dưới, điều này không phải là trường hợp tôi tin.

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) 

Xin vui lòng cho tôi biết suy nghĩ của bạn ...

Trả lời

7

Nó thực sự làm điều ngược lại, nhưng những tác động quan sát được đều giống nhau.

Khi so sánh hai chuỗi có độ dài không bằng nhau, một trong các quy tắc của SQL (tiêu chuẩn, không chỉ SQL Server) là chuỗi ngắn hơn được đệm với khoảng trắng cho đến khi cùng độ dài và sau đó so sánh được thực hiện.

Nếu bạn muốn tránh ngạc nhiên, bạn sẽ cần phải thêm ký tự không dấu cách ở cuối mỗi chuỗi.


Trong thực tế, kiểm tra standard text, dường như có hai tùy chọn:

4,6 Loại chuyển đổi và trộn các loại dữ liệu

...

Khi giá trị của chiều dài bất bình đẳng được so sánh, nếu chuỗi đối chiếu cho so sánh có thuộc tính NO PAD và va li ngắn hơn lue bằng một tiền tố giá trị dài hơn, thì giá trị ngắn hơn được coi là nhỏ hơn giá trị dài hơn. Nếu chuỗi đối chiếu cho so sánh có thuộc tính PAD SPACE, với mục đích so sánh, giá trị ngắn hơn được kéo dài hiệu quả đến độ dài của số dài hơn bằng cách nối < không gian> s ở bên phải.

Nhưng tất cả collations SQL Server mà tôi biết là PAD SPACE.

+1

Không thực sự. Vì vậy, tiêu chuẩn tuyên bố rằng nó sẽ đạt đến độ dài tối đa * để so sánh *, nhưng câu hỏi là về đầu ra của GROUP BY, đó là ** KHÔNG ** dài hơn như bạn mong đợi nếu đúng là các trung gian được kéo dài (họ không).Nó chỉ đơn giản là ''a' = 'a'' (dấu cách bị bỏ qua) – RichardTheKiwi

+3

@RichardTheKiwi - phần 8.2 "Tùy thuộc vào trình tự đối chiếu, hai chuỗi có thể com- pare bằng nhau ngay cả khi chúng có độ dài khác nhau hoặc con- Khi các hoạt động MAX, MIN, DISTINCT, tham chiếu đến cột nhóm và các toán tử UN2, EXCEPT và INTERSECT tham chiếu đến ký tự chuỗi, ** giá trị cụ thể được chọn bởi các hoạt động này từ một tập các giá trị bằng nhau như vậy phụ thuộc vào việc thực hiện. ** "(Nhấn mạnh thêm) –

2

này là dễ dàng hơn để xem:

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 

Chú ý khoảng cách giữa A và dấu chấm. Nó đã chọn phiên bản 1 không gian trên 0 không gian.
Cũng thông báo rằng nhóm D chọn một với 2 dấu không gian trong vòng 4.

Vì vậy, không nó không thực hiện một RTRIM. Tuy nhiên, có một lỗi là mềm vì đó là tùy ý chọn một trong hai cột (cột đầu tiên được xem là kết quả của GROUP BY có thể ném bạn đi nếu không gian quan trọng.

Các vấn đề liên quan