with temp
as
(
select '김삼순' nm union all
select '김호랭' union all
select '금이빨' union all
select '나가라' union all
select '나와라' union all
select '노랭이' union all
select '라면빨' union all
select '라이도' union all
select '마파두부' union all
select '모자장수' union all
select '밥퍼요' union all
select '밥줘요'
), part1(seq, part1)
as
(
select 0, 'ㄱ' union all
select 1, 'ㄲ' union all
select 2, 'ㄴ' union all
select 3, 'ㄷ' union all
select 4, 'ㄸ' union all
select 5, 'ㄹ' union all
select 6, 'ㅁ' union all
select 7, 'ㅂ' union all
select 8, 'ㅃ' union all
select 9,'ㅅ' union all
select 10,'ㅆ' union all
select 11,'ㅇ' union all
select 12,'ㅈ' union all
select 13,'ㅉ' union all
select 14,'ㅊ' union all
select 15,'ㅋ' union all
select 16,'ㅌ' union all
select 17,'ㅍ' union all
select 18,'ㅎ'
), part2(seq, part2)
as
(
select 0, 'ㅏ' union all
select 1, 'ㅐ' union all
select 2, 'ㅑ' union all
select 3, 'ㅒ' union all
select 4, 'ㅓ' union all
select 5, 'ㅔ' union all
select 6, 'ㅕ' union all
select 7, 'ㅖ' union all
select 8, 'ㅗ' union all
select 9,'ㅘ' union all
select 10,'ㅙ' union all
select 11,'ㅚ' union all
select 12,'ㅛ' union all
select 13,'ㅜ' union all
select 14,'ㅝ' union all
select 15,'ㅞ' union all
select 16,'ㅟ' union all
select 17,'ㅠ' union all
select 18,'ㅡ' union all
select 19,'ㅢ' union all
select 20,'ㅣ'
), part3(seq, part3)
as
(
select 0, '' union all
select 1, 'ㄱ' union all
select 2, 'ㄲ' union all
select 3, 'ㄳ' union all
select 4, 'ㄴ' union all
select 5, 'ㄵ' union all
select 6, 'ㄶ' union all
select 7, 'ㄷ' union all
select 8, 'ㄹ' union all
select 9,'ㄺ' union all
select 10,'ㄻ' union all
select 11,'ㄼ' union all
select 12,'ㄽ' union all
select 13,'ㄾ' union all
select 14,'ㄿ' union all
select 15,'ㅀ' union all
select 16,'ㅁ' union all
select 17,'ㅂ' union all
select 18,'ㅄ' union all
select 19,'ㅅ' union all
select 20,'ㅆ' union all
select 21,'ㅇ' union all
select 22,'ㅈ' union all
select 23,'ㅊ' union all
select 24,'ㅋ' union all
select 25,'ㅌ' union all
select 26,'ㅍ' union all
select 27,'ㅎ'
), rs
as
(
select
nchar(part1) part1
, case when sum(part2)/count(*) = min(part2) then nchar(min(part2)) end part2
, case when
sum(part2)/count(*) = min(part2)
and sum(part3)/count(*) = min(part3)
then nchar(min(part3))
end part3
from (
select
nm
, 0x1100 + ((unicode(nm) - 0xAC00) / (21*28)) part1
, 0x1161 + ((unicode(nm) - 0xAC00) % (21*28)) / 28 part2
, 0x11A7 + ((unicode(nm) - 0xAC00) % 28) part3
from temp
) t
group by
nchar(part1)
)
select
case
when a.part1 is not null and a.part2 is null and a.part3 is null
then a.part1
when a.part1 is not null and a.part2 is not null and a.part3 is null
then nchar(0xAC00 + (b.seq*21*28)+(c.seq*28))
when a.part1 is not null and a.part2 is not null and a.part3 is not null
then nchar(0xAC00 + (b.seq*21*28)+(c.seq*28)+d.seq)
end 결과
from rs a
left join part1 b
on a.part1 = b.part1
left join part2 c
on a.part2 = c.part2
left join part3 d
on a.part3 = d.part3
/*
결과
----
ᄀ
ᄂ
라
ᄆ
밥
(5개 행 적용됨)
*/