저는 DB2를 사용하고 있습니다.
Oracle의 split 함수가 DB2에는 없다고 해서,
인터넷을 뒤지다가 내가 필요한 딱 들어맞는 split 함수가 없어서,
DB2에서 사용할 spilt 할수를 만들었습니다.
여기 저기 뒤지고 다니기 귀찮으신 분들 이거 가져다 쓰세요.
내가 내가 필요한 기능에 맞춰 작성한 거니까 맞껏 퍼쓰셔도 됩니다.
이 Function에 잘못된 부분이 발견될 수 있습니다.
또 각 프로젝트에 필요한 요건에 딱 들어맞지 않을 수도 있습니다.
그건 알아서 수정해서 사용하세요.
1. Function 생성 스크립트
-- 작성일 : 2012/05/14
-- 작성자 : 황상규 (urajilation@gmail.com)
-- 내 용 : 특정 문자열에서 임의로 정의한 Delimeter로 구분하여, 몇번째 문자열있는 문자열을 반환한다.
-- 용도 : 특정문자열을 구분자(Delimeter)로 가진 문자열에서 특정 순서에 있는 문자열을 구하는 용도
-- 구현환경 : IBM DB2
-----------------------------------------------------------------------------------------------
CREATE FUNCTION SPLIT_DELIMETER(pos INT, delimeter VARCHAR(10), string VARCHAR(4000))
LANGUAGE SQL
RETURNS VARCHAR(2000)
DETERMINISTIC NO EXTERNAL ACTION
BEGIN ATOMIC
DECLARE x INT;
DECLARE s INT; -- split한 결과 String의 시작 위치
DECLARE e INT; -- split한 결과 String의 끝 위치
DECLARE d INT; -- delimeter String의 길이
DECLARE tempString VARCHAR(4200); -- delimeter String의 길이
SET x = 0;
SET s = 0;
SET e = 0;
SET d = LENGTH(delimeter);
-- 검색할 string의 앞뒤에 delimeter를 연결한다.
-- 원 Data의 앞뒤에 delimeter가 없다면 이 부분은 제거한다.
SET tempString = delimeter || string || delimeter;
WHILE (x < pos) DO
SET s = locate(delimeter, tempString, s + 1);
IF s = 0 THEN
RETURN NULL;
END IF;
SET x = x + 1;
END WHILE;
SET e = locate(delimeter, tempString, s + 1);
IF s >= e THEN
SET e = LENGTH(tempString) + 1;
END IF;
RETURN SUBSTR(tempString, s + d, e - s - d);
END
-----------------------------------------------------------------------------------------------
2. 사용법
-- 샘플 데이타 : "유준상-@-김남주-@-강부자-@-김태희"
-- 두번째 이름 : "김남주"
-- 샘플 실행 SQL
-----------------------------------------------------------------------------------------------
SELECT
SPLIT_DELIMETER(2,'-@-','유준상-@-김남주-@-강부자-@-김태희') AS NAME
FROM TABLE_EXAMPLE
-----------------------------------------------------------------------------------------------