테이블명 : 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 조건의 어떻게 수정해야지 숫자중간의 주민번호 유형이 존재할경우 찾아낼수 있을까요?
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) ;