2017-09-19 1 views
0

커다란 고객 데이터 목록이 있습니다. Address1 열에서 5 자리 숫자의 우편 번호 만 받고 싶습니다. TSQL : 문자열에서 고정 길이의 숫자 만 추출하는 방법

내가 아래 지저분한 코드가 있습니다

SELECT 
    (SELECT LEFT(SUBSTRING(Address1, PATINDEX('%[0-9]%', Address1), 8000), 
     PATINDEX('%[^0-9]%', SUBSTRING(Address1, PATINDEX('%[0-9]%', Address1), 8000) + 'X') -1)) 
FROM CustomerList where LEN(LEFT(SUBSTRING(Address1, PATINDEX('%[0-9]%', Address1), 8000), 
     PATINDEX('%[^0-9]%', SUBSTRING(Address1, PATINDEX('%[0-9]%', Address1), 8000) + 'X') -1)) = 5 -- Get only records that has exactly 5 value 

위의 코드를 들어, 다음과 같은 데이터가 작동합니다

"str을 부티레이트 존스 40030이.."-

"40030"을받을 수 그러나 다음 데이터가 작동하지 않습니다.

"22 Str. Mel 50630"- 우편 번호가 아닌 "22"번지 수만 가능합니다.

"65-31 캄파 르 47000 바우는"- 만 65

"부지 199 Guasa 30,990 오마르"을받을 수 - 만

199 그래서 내 코드는 우편 번호 만이 레코드를 얻을 수 있습니다 얻을 수 있습니다. Address1에 다른 번호가 포함되어 있으면 작동하지 않습니다.

도와주세요.

편집 :

은 분명히 내 현재 코드는`왼쪽에서 숫자를 읽기 시작되고, 나는 RIGHT 대신에서 읽기 시작하는 현재의 코드를 수정할 수있는 방법이있다? 당신이 이런 식으로 뭔가를 사용하려고 할 수 있습니다 게시 예와

+0

데이터의 우편 번호는 항상 주소의 마지막/마지막 부분에 있습니까? – Tyron78

+0

거대한 데이터 목록이있는 경우 우편 번호는 * 별도 * 필드 여야합니다. * 하나 * 우편 번호에 대해 검색 할 때마다 1M 행을 분석한다고 가정 해보십시오. –

+0

@PanagiotisKanavos 데이터가 클라이언트에 의해 제공되므로 필터링하고 다른 열로 분리해야합니다. –

답변

2

무엇 단순히 주소의 마지막 부분을 제거 어떻습니까? 예 :

DECLARE @Address1 NVARCHAR(100) = 'Lot 199 Guasa 30990 Omar'; 
SELECT 
    (SELECT REVERSE(LEFT(SUBSTRING(REVERSE(@Address1), PATINDEX('%[0-9]%', REVERSE(@Address1)), 8000), 
    PATINDEX('%[^0-9]%', SUBSTRING(REVERSE(@Address1), PATINDEX('%[0-9]%', REVERSE(@Address1)), 8000) + 'X') -1))) AS PostCode 
+0

죄송합니다. 게시물 코드가 마지막 부분에 정확하게 있지 않으므로'RIGHT '를 사용하는 또 다른 2 개의 샘플 데이터를 추가했습니다. –

+0

역방향 문자열에서 Regexp를 사용하고 다시 한 번 결과를 역으로 사용하여 검색어를 수정했습니다. .. – Tyron78

+0

와우 좋은. '거꾸로 '에 대해 새로운 것을 배워라. 고마워, 정말 고마워. –

0

:

WITH X AS (SELECT '65-31 Kampar 47000 Bau' AS A UNION ALL SELECT 'Str. Jt. Jones 40030' UNION ALL SELECT 'Lot 199 Guasa 30990 Omar' ) 

SELECT REVERSE(SUBSTRING(REVERSE(A), patindex('%[0-9]%', REVERSE(A)) ,5)) FROM X 

출력 :

47000 
40030 
30990 
관련 문제