2012-08-29 4 views
0

하나의 열에서 데이터를 가져 와서 MyTable.SSN, 같은 테이블의 다른 테이블 (MyTable.SSNWithDashes)에 다른 형식으로 복사하려고합니다. MyTable.SSN에 정확히 9 자리가 없으면 전혀 처리하지 않아도됩니다.하위 쿼리를 제거하려면이 문을 리팩터링 할 수 있습니까?

나는이 시도했다 : 나는 경고가 무슨 말을 이해 않지만

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

, 정말 아니에요 :이 작동하는 동안

IF(SELECT LEN([SSN]) FROM [MyTable]) = 9 
UPDATE [MyTable] SET [SSNWithDashes] = LEFT([SSN], 3) + '-' + SUBSTRING([SSN], 4, 2) + '-' + RIGHT([SSN], 4) 
ELSE 
UPDATE [MyTable] SET [SSNWithDashes] = NULL 

, 그것은 오류가 발생합니다 이것에 대해 어떻게 다르게 가야하는지.

리팩터링하여 경고를 제거하고 (조금 깔끔하게 읽을 수있는 방법) 어떻게해야합니까?

답변

4
UPDATE dbo.[MyTable] 
    SET [SSNWithDashes] = CASE 
    WHEN LEN(SSN) = 9 THEN 
    LEFT([SSN],3) + '-' + SUBSTRING([SSN],4,2) + '-' + RIGHT([SSN],4) 
    ELSE NULL 
END; 
1

가정 당신의 SSNWithDashes가 이미 NULL 다음

UPDATE dbo.[MyTable] 
    SET [SSNWithDashes] = LEFT([SSN],3) + '-' + SUBSTRING([SSN],4,2) + '-' + RIGHT([SSN],4) 
WHERE LEN(SSN) = 9 

다른 모든 행이 NULL

+0

첫 번째 라인은 가치있는 부인이다 남아있다. SSNWithDashes에 LEN (SSN)이 9가 아닌 행에 대해 잘못된 데이터가 있으면 해당 행이 그대로 유지됩니다. 데이터의 성격을 아는 경우에는 좋은 접근 방법이지만 그렇지 않은 경우에는 가장 안전한 방법은 아닙니다. –

+0

나는 당신과 동의한다, "안전하다"는 말이다. "MyTable.SSN에 정확히 9 자리가 없으면 전혀 처리하지 않아도됩니다."_ OP의 질문에서 _ – codingbiz

관련 문제