종종..어플을 개발하던 어찌하던
필드 하나에 여러개의 필드값을 구분자로 저장해야 하는 경우가 생긴다.
예를들면,
"도서>국내도서>소설" 같이
분류를 나타내야 하는데,
하위 detph제한 없이 스키마를 구성하려면, 한필드에 구분자를 넣어서 집어 넣는 경우가 생긴다.
물론 이건 자바같은것에선 str.split('>') 같이 사용하면 되지만,
갑자기 1depth, 2depth, 3depth 의 필드로 구분된 뷰를 만들어 달라고 했다면 ???
어찌할것인가? 만약 내부함수만으로 한다면 instr과 substr등이 남발되면서
sql문이 상당히 길어지므로 개인적으론 프로시저(펑션)을 만드는것을 추천한다.
오라클 기준으로 만든 소스...
create or replace
FUNCTION FN_JMC_SPLIT (str IN VARCHAR, del IN VARCHAR, idx IN INTEGER)
RETURN CHAR IS
/***************************************
abc:de:fghi 를 구분자(:)를
기준으로 idx번째 데이터를 가져옴
만약 해당 데이터가 없다면 null
@make by 정민철
****************************************/
temp_idxst INTEGER; --시작
temp_idxed INTEGER; --끝
temp_leng INTEGER; --길이
temp_limit INTEGER;
cnt INTEGER;
codersb VARCHAR2(100);
BEGIN
codersb := '';
temp_limit := length(str);
cnt := 0;
temp_idxst := 1;
temp_idxed := 1;
for cnt IN 1..idx loop
temp_idxed := instr(str, del, temp_idxst);
-- 구분자를 찾을수 없을때(마지막데이터임)
if temp_idxed = 0 then
temp_idxed := temp_limit + 1;
end if;
temp_leng := temp_idxed - temp_idxst;
-- 해당 index라면 codersb값을 세팅해줌
if cnt = idx then
codersb := substr(str,temp_idxst, temp_leng);
end if;
-- 시작 index를 갱신
temp_idxst := temp_idxed + 1;
end loop;
RETURN codersb;
END FN_JMC_SPLIT;
[결과]
Select FN_JMC_SPLIT('도서>국내도서>소설','>', 1) ... from .... ==> 도서
Select FN_JMC_SPLIT('도서>국내도서>소설','>', 2) ... from .... ==> 국내도서
Select FN_JMC_SPLIT('도서>국내도서>소설','>', 3) ... from .... ==> 소설
Select FN_JMC_SPLIT('도서>국내도서>소설','>', 4) ... from .... ==> null