주민번호 숫자 골라내기(난이도 上) 0 12 1,683

by 박성현장군님 [SQL Query] [2017.08.23 14:37:07]


테이블명 : TRANS_RECP

칼럼명 : TR_BIGO

예를 들어서 TR_BIGO   의 값들이 

'성현 |890228123456|서울거주'

'종훈01024111545|890228123456|인천거주'

'지현|0221110|890228223456|제주거주'

'종현01024111545890228123456김포거주'

'미현01024111545|12332233233456|서울거주''

요렇게 있을때요. TRANS_RECP테이블의 TR_BIGO의 값중 주민번호가들어있는 데이터만 뽑아보고 싶은데요.

제가 현재

SELECT * FROM TRANS_RECP

WHERE

LENGTH(TRANSLATE(TR_BIGO,'0123456789'||'TR_BIGO, '0123456789')) > 12 --데이터중 숫자만12자리 이상

AND SUBSTR(TRANSLATE(TR_BIGO,'0123456789'||'TR_BIGO, '0123456789') , '7', '1') IN ('1','2','4')

--7번째 자리가 1,2,4 이여함

AND SUBSTR(TRANSLATE(TR_BIGO,'0123456789'||'TR_BIGO, '0123456789') , '3', '2') < '13' --월은 13보다 작다.

AND SUBSTR(TRANSLATE(TR_BIGO,'0123456789'||'TR_BIGO, '0123456789') , '3,' '2')  != '00' --월은00이면 안됨

AND SUBSTR(TRANSLATE(TR_BIGO,'0123456789'||'TR_BIGO, '0123456789') , '5', '2') < '13' --월은 13보다 작다.

AND SUBSTR(TRANSLATE(TR_BIGO,'0123456789'||'TR_BIGO, '0123456789') , '5', '2') != '00' --월은00이면 안됨

 

요렇게 WHERE 조건 구현을 했는데 문제가 '성현 |890228123456|서울거주' <--요런 친구는 잡아내는데요

'종현01024111545890228123456김포거주' <-- 요친구같이 앞에 숫자가 섞여있으면 못 찾아내는데요.

혹시 WHERE 조건의 어떻게 수정해야지 숫자중간의 주민번호 유형이 존재할경우 찾아낼수 있을까요?

 

 

by 우리집아찌 [2017.08.23 14:47:49]

개인적으로 '종현01024111545890228123456김포거주'  이렇게 들어오면 구분자 넣어서 만들어 달라고 합니다.

주민번호에 "-" 값도 올수있고 요즘은 개인정보보호법에 의하여 주민번호 암호화 되어있는곳이 많은데

뭐가 올지 난감합니다.

 


by 아발란체 [2017.08.23 15:01:03]

어렵다... @.@)/


by 우리집아찌 [2017.08.23 15:04:10]

주민번호 맨 뒷자리가 CHECK SUM? LOGIC으로 되어있을겁니다.

하지만 위에것에 적용하기는 좀 힘들지 않을까 하네요.

처음 데이터 받을때 컬럼이나 구분자 형태로 받는것을 추천합니다.


by 마농 [2017.08.23 15:05:53]

7번 째 자리는 1,2,4 로 제한하는 것은 잘못된 생각인 듯.
 - 1,2 1900 년대 출생
 - 3,4 2000 년대 출생
 - 9,0 1800 년대 출생
 - 5,6,7,8 외국인?


by 우리집아찌 [2017.08.23 15:08:36]

몰랐는데 찾아보니 코드가 전부 있군요.

9 : 1800 ~ 1899년에 태어난 남성

0 : 1800 ~ 1899년에 태어난 여성

1 : 1900 ~ 1999년에 태어난 남성

2 : 1900 ~ 1999년에 태어난 여성

3 : 2000 ~ 2099년에 태어난 남성

4 : 2000 ~ 2099년에 태어난 여성

5 : 1900 ~ 1999년에 태어난 외국인 남성

6 : 1900 ~ 1999년에 태어난 외국인 여성

7 : 2000 ~ 2099년에 태어난 외국인 남성

8 : 2000 ~ 2099년에 태어난 외국인 여성


by 박성현장군님 [2017.08.23 15:24:21]

헉 그건 몰랐네요.


by 마농 [2017.08.23 15:59:31]

최소한 띄어쓰기라도 해주셔야 할 듯 하네요.
정규식을 이용한 검색방법을 사용해 보세요.
REGEXP_LIKE


by 마농 [2017.08.24 09:10:42]
WITH t AS
(
SELECT '성현 |8902281234567|서울거주' tr_bigo FROM dual
UNION ALL SELECT '종훈01024111545|8902281234567|인천거주'  FROM dual
UNION ALL SELECT '지현|0221110|8902282234567|제주거주'     FROM dual
UNION ALL SELECT '종현010241115458902281234567김포거주'    FROM dual    -- 오탐(2411154589022)
UNION ALL SELECT '미현01024111545|12332233233456|서울거주' FROM dual
)
SELECT tr_bigo
     , REGEXP_SUBSTR(tr_bigo, pattern) x
  FROM t
     , (SELECT '([0-9]{2})'                  -- 연 2 자리 (00~99)
            || '(0[1-9]|1[0-2])'             -- 월 2 자리 (01~12)
            || '(0[1-9]|[1-2][0-9]|3[0-1])'  -- 일 2 자리 (01~31)
            || '([1-4])'                     -- 7번째 구분 (1,2,3,4 만 있다고 가정)
--          || '([0-9])'                     -- 7번째 구분 (0~9)
            || '([0-9]{6})'
            AS pattern
          FROM dual
        )
 WHERE REGEXP_LIKE(tr_bigo, pattern)
;

 


by 우리집아찌 [2017.08.24 13:19:28]

마농님 오탐의 의미는 먼가요?


by 우리집아찌 [2017.08.24 13:20:03]

패턴을 따로 빼니까 가독성이 좋아지네요.. 생각 못해봤네요.


by 마농 [2017.08.24 13:32:56]

핸드폰번호(01024111545)와 주민번호(8902281234567)가 공백 없이 붙어 있으므로 인해
핸드폰번호 일부(24111545)와 주민번호 일부(89022)가 결합되어
(2411154589022) 주민번호 패턴으로 인지되고 있어서 오탐.


by 우리집아찌 [2017.08.24 14:23:41]

아 그런 의미였군요.. 감사합니다 ^^

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