본문 바로가기

ORACLE

[SQL] 주민등록 번호 체계

주민등록 번호 체계

주민등록번호를 “YYMMDD-ABCDEFG” 라고 하겠습니다.

앞자리(YYMMDD)는 생년월일 각각 2자리씩을 사용해서 총 6자리입니다.

1988년 12월 15일 생이면 881215를 사용하게 되죠.

뒷자리는 총 7자리로 구성되어 있습니다.

lA : 성별 및 년대구분
lBCDE : 출생 신고지의 지역번호(4자리)
lF : 신고일에 해당 동사무소에 출생 신고된 순서
lG : 오류 검증 번호

A 값은 출생 년대별로 다릅니다.
l1800년대 : 남(9), 여(0)
l1900년대 : 남(1), 여(2)
l2000년대 : 남(3), 여(4)
l2100년대 : 남(5), 여(6)
l2200년대 : 남(7), 여(8)

외국인의 경우 A 값은 다음과 같습니다.
l남(7), 여(8)

주민등록번호가 발급되지 않은 외국인의 ABCDEFG 체계
l남(1000000), 여(2000000)

출처 : 행자부

주민등록번호를 이용한 성별의 일반화

자 이제 주민등록번호 뒷자리를 이용해서 성별을 분류해 보겠습니다.
남자의 경우 부민등록번호 뒷부분의 첫 자리에 공통점이 있습니다. 눈치 채셨나요?
네. 바로 홀수라는 점이죠. 여자는 당연히 짝수라는 공통점이 있습니다.

이럴 때 유용하게 사용할 수 있는 연산자는?
네. 바로 Modular(%) 연산자 입니다.
나머지값을 반환하기 때문에 분류하는데 많이 사용되는 방식입니다.

l남자 : (주민등록번호 뒷부분 첫 자리) % 2 = 1
l여자 : (주민등록번호 뒷부분 첫 자리) % 2 = 0

이것을 TSQL 문으로 변환해 보면 다음과 같습니다.

--주민등록번호 컬럼명 : ssn (- 없이 저장)
case substring(ssn, 7, 1) % 2
when 1 then 'M'
when 0 then 'F'
end

참고)
Ssn은 Social Security Number의 약자로써 미국에서 사용하는 사회 보장 번호를 의미합니다. 우리나라의 주민등록번호와 유사한 제도이죠.

이 쿼리를 다음과 같이 함수로 만들어서 사용하면 편하겠네요.

성별을 반환하는 함수 작성하기

/*
작성자 : 한기환
작성일 : 2005-07-31
내용
주민등록번호를 입력받아서 성별을 반환하는 함수
입력값
주민등록번호 13자리
또는 주민등록번호 14자리 (-포함)
반환값
M : 남자
F : 여자

사용예
--주민등록번호 사이에 - 가 포함된 경우
select dbo.fnGetSexFromSSN('881215-1234567') as 성별
select dbo.fnGetSexFromSSN('881215-2234567') as 성별

--주민등록번호 사이에 - 가 포함되지 않은 경우
select dbo.fnGetSexFromSSN('8812151234567') as 성별
select dbo.fnGetSexFromSSN('8812152234567') as 성별

*/

CREATE FUNCTION dbo.fnGetSexFromSSN(
@ssn varchar(14)
)
RETURNS char(1)
AS
BEGIN
RETURN (
SELECT CASE SUBSTRING(REPLACE(@ssn, '-', ''), 7, 1) % 2
WHEN 1 THEN 'M'
WHEN 0 THEN 'F'
END
)
END
GO