2014-03-19 2 views
1

도시, 주 및 우편 번호를 포함하는 테이블 열이 있습니다. 나는 이것을 3 가지로 나누고 싶다.분할 도시, 주, 하나의 열에서 3 별도로 우편 번호, 또한 9 자리 우편 번호에 대시를 추가하십시오.

나는 이것이 잘못된 것인지 궁금해하고있다. 다음은 모두 추출하는 시도입니다.

SELECT [City State Zip] 
    ,CHARINDEX(',',[City State Zip]) AS [Comma location] 
    ,SUBSTRING([City State Zip],CHARINDEX(',',[City State Zip]),13) AS [State and Zip] 
    ,SUBSTRING(SUBSTRING([City State Zip],CHARINDEX(',',[City State Zip]),13),5,9) 

-- Below code attempts to add a dash to the 9 digit zip codes but appears to only be doing it to some of them 
    CASE LEN(SUBSTRING(SUBSTRING([City State Zip],CHARINDEX(',',[City State Zip]),13),5,9)) 
     WHEN 9 
     THEN 
      STUFF((SUBSTRING(SUBSTRING([City State Zip],CHARINDEX(',',[City State Zip]),13),5,9) 
     ELSE 
      (SUBSTRING(SUBSTRING([City State Zip],CHARINDEX(',',[City State Zip]),13),5,9) 
     END AS Zip 

    ,SUBSTRING([City State Zip],0,CHARINDEX(',',[City State Zip])) AS City 

-- This code for extracting the STATE is producing an error "Invalid length parameter passed to the SUBSTRING function" 
    ,SUBSTRING([City State Zip],CHARINDEX(',',[City State Zip])+1,LEN([City State Zip])- (CHARINDEX(',',[City State Zip])+1 + 5)) 

FROM dbo.foo 

이제 상태를 어떻게 추출합니까? 현재 "SUBSTRING 함수에 전달 된 길이가 잘못된 매개 변수"와 함께 실패합니다.

도시에는 항상 쉼표가 따라 오며 상태는 항상 2 자리입니다.

샘플 데이터 아래 :

조지 타운, DE 19947

그린 우드, DE 199502039

도버, DE 19901

뉴 캐슬, DE 197205069

루이스, DE 199581984

뉴 워크, 독일 197118734

서머나, DE 19904

볼티모어, MD 21020

도버, DE 19901

+0

을 도시는 folowed되지 않습니다 혼수 상태로 표출 함 :) – PeterRing

+0

고맙습니다. 샘플 데이터를 수정했습니다. –

답변

1

는 나는 당신의 논리를 끊고이 같은 쿼리를 사용합니다 : 샘플 데이터에

SELECT 
    [city], 
    [state], 
    CASE LEN([zip]) 
     WHEN 5 THEN [zip] 
     WHEN 9 THEN STUFF([zip],6,0,'-') 
    END [zip] 
FROM (
    SELECT 
     LEFT([City State Zip],CHARINDEX(',',[City State Zip])-1) [city], 
     SUBSTRING([City State Zip],CHARINDEX(',',[City State Zip])+2,2) [state], 
     RIGHT([City State Zip],CHARINDEX(' ',REVERSE([City State Zip]))-1) [zip] 
    FROM dbo.foo 
) A 
0

여기에, 그것을 해결시의 열을 분할하는 작업 코드, 국가는 3 별개로 우편 번호 9 자리 숫자 인 경우에는 대시를 추가해야합니다.

SELECT 

CASE LEN(SUBSTRING(SUBSTRING([City State Zip],CHARINDEX(',',[City State Zip]),13),5,9)) 
    WHEN 9 
    THEN 
     STUFF((SUBSTRING(SUBSTRING([City State Zip],CHARINDEX(',',[City State Zip]),13),5,9) 
    ELSE 
     (SUBSTRING(SUBSTRING([City State Zip],CHARINDEX(',',[City State Zip]),13),5,9) 
    END AS Zip 

,SUBSTRING([City State Zip],0,CHARINDEX(',',[City State Zip])) AS City 
,SUBSTRING([City State Zip],CHARINDEX(',',[City State Zip])+1,4) AS STATE 

FROM dbo.foo 
0

이 상태는 항상 공백으로 둘러싸여 가정하면 :

DECLARE @citystatezip VARCHAR(100)='Georgetown, DE 19947' 

SELECT substring(@citystatezip,1,Charindex(',',@citystatezip,0)-1), 
     LTRIM(RTRIM(substring(@citystatezip,Charindex(',',@citystatezip,0)+1,4))), 
     substring(@citystatezip,Charindex(',',@citystatezip,0)+5,LEN(@citystatezip)) 
관련 문제