문자+숫자로 된 데이터 구분 1 5 842

by 오라크으을럽 [SQL Query] [2021.01.21 09:14:44]


주소DB 최신화 작업중입니다.

사용자가 조회조건을 도로명 + 건물본번 식으로 입력을 하는데

도로명과 건물본번을 구분이 필요합니다.

예로 가평로19는 가평로 값과 19값을 가져와야 합니다.

해서 아래와 같이 작업을 했는데

 SELECT TRANSLATE('가평로19', 'a0123456789', 'a') 도로명,
         REGEXP_REPLACE('가평로19', '[^0-9]') 건물본번
  FROM DUAL

위 같은 경우에는 정상적으로 가져오나

도로명에 숫자가 있는 경우가 있더라구요.

예로 가평1로19 이런경우에는 

SELECT TRANSLATE('가평1로19', 'a0123456789', 'a') 도로명,
         REGEXP_REPLACE('가평1로19', '[^0-9]') 건물본번
  FROM DUAL

도로명이 가평로, 건물본번이 119 로 불러와 버립니다.

도로명은 숫자로 끝나는 경우가 없이 항상 문자로 끝나고

건물본번은 숫자타입입니다.

해서 끝자리부터 체크하여 문자 전까지 짤라

가평1로 , 19 이런식으로 표기하는 방법이 있을까요?

 

 

by 마농 [2021.01.21 12:29:30]
WITH t AS
(
SELECT '가평로' addr FROM dual
UNION ALL SELECT '가평로19' FROM dual
UNION ALL SELECT '가평1로19' FROM dual
)
SELECT addr
       -- 1. 일반 문자 함수 이용
     , RTRIM(addr, '0123456789') addr1_1
     , REPLACE(addr, RTRIM(addr, '0123456789')) addr2_1
       -- 2. 정규표현식 함수 이용
     , REGEXP_REPLACE(addr, '[0-9]+$') addr1_2
     , REGEXP_SUBSTR (addr, '[0-9]+$') addr2_2
  FROM t
;

 


by 오라크으을럽 [2021.01.21 13:06:50]

답변감사드립니다.


by 동동동 [2021.01.22 09:54:08]

마농님 정규식 설명 좀 부탁드려도 될까요?

, REGEXP_REPLACE(addr, '[0-9]+$') addr1_2

=> [0-9]+ = 0부터 9까지 반복한다 로 알고 있는데 끝에 $ 가 붙어서 어떻게 동작되는건지요?

 

, REGEXP_SUBSTR (addr, '[0-9]+$') addr2_2

=> 이건 숫자만 추출하려고 한것 같은데.. 어떻게 되는건지 전혀 모르겠네요...

 

정규식을 찾아보고 있는데요..

[0-9] => 0부터 9 까지의 범위를 나타내고

+ => 반복

$ =>문자열로 끝난다.

 라고 설명이 되어 있는데..저런게 조합되어 어떻게 사용되는 건지 이해가 잘 되지 않네요..

 


by 마농 [2021.01.22 10:24:36]

$ 는 "문자열로 끝난다"가 아니라 "문자열의 맨 끝"을 의미합니다.
'[0-9]+$' 은 맨 끝부분에 숫자가 연속된 걸 의미합니다.
참고로 ^ 은 맨 처음을 의미 '^[0-9]' 는 숫자로 시작


by 동동동 [2021.01.22 15:59:40]

마농님 답변 감사드립니다...^^

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입