2016-09-08 2 views
0

firstNamelastName 열의 연결을 기반으로 테이블을 검색하려고합니다. 쿼리는 때때로 연결된 열이 여분의 공백으로 채워집니다 때문에 일치하는 항목을 찾지 못하는LEN (firstName) + LEN (lastName)이 LEN (firstName + lastName)과 같지 않음

NVARCHAR(50) NOT NULL로이 두 가지 정의된다. 여기에 쿼리 :

SELECT firstName + lastName AS fullName, LEN(firstName) + LEN(lastName) AS realLength, LEN(firstName + lastName) AS concatLength FROM UsersTable 

그리고 여기 결과에 이미지의 :

Query results

이 함께 거래는 무엇입니까? 여분의 공간을 어떻게 피할 수 있습니까? 내가 할 경우 SELECT RTRIM(firstName) + RTRIM(lastName) ... 여분의 공백없이 정확한 전체 이름을 얻을 수 있지만 RTRIM을 사용하면 데이터 집합이 너무 커서 값이 너무 비쌉니다. 이로 인해 LEN(firstName)LEN(RTRIM(firstName))과 동일하고

+1

, 당신은 왜 자신의 계산 열로 검색하는 값을 지속하지? –

+1

2 개의 varchar 값을 함께 추가하면 오른쪽 패딩 된 공백이 생깁니다. 문제는 코드에 없으며 데이터에 있습니다. 무엇이든지 당신의 varchars를 채우는 것이 문제입니다. –

+1

방금 ​​방대한 데이터 세트에 대한 쿼리를 시도했는데 정답을주었습니다. 스크린 샷을보세요. 당신의'fullName' 컬럼은 첫 번째 이름과 빈칸을 보여줍니다. 문제는 데이터가 아니라 쿼리입니다. 나는 당신의 이름 컬럼이'NVarChar'가 아니라'VarChar'인지 (한 번했는지) 확신합니다. 한 번에 –

답변

3

과 같음을 제외하고는 문제가 데이터 자체라고 생각할 수 있습니다. FirstName 끝에 공백이 있습니다. 다음과 같은 수익률 4 확인하기에 충분 쉽게 :

select len(N'abcd ') 

이것은 varchar() 데이터 유형 및 len()의 속성입니다. 물론, 연결할 때 다음 SQL Server 끝에 공백을 인식하기로 결정합니다.

이 동작은 documentation의 "비고"섹션에 설명되어

은 후행 공백

LEN 제외 소견. 문제가있는 경우 문자열을 자르지 않는 DATALENGTH (Transact-SQL) 함수를 사용하는 것이 좋습니다. 는 유니 코드 문자열을 처리하는 경우, DATALENGTH 문자 수의 두 배 를 반환합니다.

의견에서 알 수 있듯이 연결하기 전에 값 ltrim()/rtrim()을 사용할 수 있습니다. 또는 like을 사용하십시오. 저장은 신경 쓰지 않아도 될 경우

+0

이다. 나는'LEN'이 후행 공백을 제외하고 있다는 사실을 몰랐습니다. 많은 감사합니다! – charmeleon

관련 문제