2012-10-11 2 views
6

GROUP BY 절에있는 열에서 RTRIM을 수행하는 것처럼 SQL Server (2008 R2에서 시도)처럼 보입니다. 아무도이를 알아 냈습니까? 내가 여기서 뭔가를 놓치고 있니?GROUP BY 동안 SPACE를 버리는 SQL Server

아래의 쿼리에서 두 개의 선택 항목이 동일한 결과 집합을 반환합니다. 이는 내가 생각하는 경우가 아니어야합니다. 내가 당신의 생각을 알려 주시기 바랍니다

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

는 사실은 반대를하고있어,하지만 관찰 효과는 동일합니다.

길이가 다른 두 문자열을 비교할 때 SQL 규칙 (SQL Server뿐 아니라 표준) 중 하나는 길이가 같고 비교가 수행 될 때까지 짧은 문자열에 공백이 채워지는 것입니다.

놀라지 않으려면 각 문자열 끝에 공백이 아닌 문자를 추가해야합니다.

4.6 유형 변환 및 데이터 유형

의 혼합 ...

값 :


사실, standard text 확인, 두 개의 옵션이 나타납니다 비교를위한 조합 순서가 이고 NO PAD 속성 인 경우 길이가 같지 않은 길이가 인 경우와 va가 더 짧은 경우 lue가 접두사 보다 길면 더 짧은 값은 보다 긴 값으로 간주됩니다. 비교를위한 조합 순서에 PAD SPACE 속성이있는 경우, 비교를 위해 짧은 값은 의 길이로 효과적으로 확장되고 오른쪽에 < 공백이 연결됩니다.

그러나 알고있는 모든 SQL Server 데이터 정렬은 PAD SPACE입니다.

+1

아니요. 따라서 표준은 비교 *를 위해 최대 길이 *를 채 웁니다. 그러나 질문은 GROUP BY의 출력에 대한 것입니다. ** NOT ** ** 중개자가 길어 진 경우에 예상 한 것보다 길수록 길지 않습니다. (그들은 그렇지 않다). – RichardTheKiwi

+3

@RichardTheKiwi - 8.2 절 "조합 순서에 따라 길이가 서로 다르거 나 두 개의 문자열이 같거나 비슷하지 않을 수도 있습니다 ( ).MAX, MIN, DISTINCT, 그룹화 열에 대한 참조 및 UNION, EXCEPT 및 INTERSECT 연산자가 문자열 인 **에서 이러한 연산에 의해 선택된 특정 값을 참조 할 때 그러한 같은 값의 세트는 구현에 의존합니다. ** "(강조 표시) –

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 그룹은 따라서 제

위에 2 개 후미 구역과 하나 아니 그것이 RTRIM를 수행하지 않는 것을 선택하는 것이다. 소프트 버그 일 수도 있지만 임의로 GROUP BY의 결과로 두 열 중 하나를 선택하면 (공백이있는 경우) 사용자를 벗어날 가능성이 있습니다.