구분자로 나눠진 문자열을 잘라서 테이블 형태로 리턴 해주는 함수
#오라클
SPEC
TYPE TB_SPLIT IS TABLE OF VARCHAR2(32767);
FUNCTION SPLIT
(
P_LIST VARCHAR2,
P_DEL VARCHAR2
) RETURN TB_SPLIT PIPELINED;
FUNCTION SPLIT
(
P_LIST VARCHAR2,
P_DEL VARCHAR2
) RETURN TB_SPLIT PIPELINED;
BODY
FUNCTION SPLIT
(
P_LIST VARCHAR2,
P_DEL VARCHAR2
) RETURN TB_SPLIT PIPELINED
IS
L_IDX PLS_INTEGER;
L_LIST VARCHAR2(32767) := P_LIST;
L_VALUE VARCHAR2(32767);
BEGIN
LOOP
L_IDX := INSTR(L_LIST,P_DEL);
IF L_IDX > 0 THEN
PIPE ROW(SUBSTR(L_LIST,1,L_IDX-1));
L_LIST := SUBSTR(L_LIST,L_IDX+LENGTH(P_DEL));
ELSE
PIPE ROW(L_LIST);
EXIT;
END IF;
END LOOP;
RETURN;
END SPLIT;
(
P_LIST VARCHAR2,
P_DEL VARCHAR2
) RETURN TB_SPLIT PIPELINED
IS
L_IDX PLS_INTEGER;
L_LIST VARCHAR2(32767) := P_LIST;
L_VALUE VARCHAR2(32767);
BEGIN
LOOP
L_IDX := INSTR(L_LIST,P_DEL);
IF L_IDX > 0 THEN
PIPE ROW(SUBSTR(L_LIST,1,L_IDX-1));
L_LIST := SUBSTR(L_LIST,L_IDX+LENGTH(P_DEL));
ELSE
PIPE ROW(L_LIST);
EXIT;
END IF;
END LOOP;
RETURN;
END SPLIT;
사용 방법
SELECT
*
FROM
TB_USER T
INNER JOIN
TABLE(SPLIT('a,b,c,d', ',') S
ON
T.USER_ID = S.COLUMN_VALUE
*
FROM
TB_USER T
INNER JOIN
TABLE(SPLIT('a,b,c,d', ',') S
ON
T.USER_ID = S.COLUMN_VALUE
#MSSQL
CREATE FUNCTION FN_SPLIT
(
@in_value VARCHAR(1000),
@in_split VARCHAR(1)
)
RETURNS @out_value TABLE ( VALUE VARCHAR(50) )
AS
BEGIN
DECLARE @v_idx1 INT, @v_idx2 INT
DECLARE @v_temp VARCHAR(1000)
SET @v_idx1 = 1
SET @v_idx2 = 1
WHILE (@v_idx2 > 0)
BEGIN
SET @v_idx2 = CHARINDEX(@in_split , @in_value , @v_idx1 )
IF @v_idx2 = 0
SET @v_temp = RIGHT(@in_value , LEN(@in_value )-@v_idx1 +1 )
ELSE
SET @v_temp = SUBSTRING(@in_value , @v_idx1 , @v_idx2 -@v_idx1 )
IF LEN(@v_temp )>0
INSERT INTO @out_value VALUES( @v_temp )
SET @v_idx1 = @v_idx2 +1
END
RETURN
END
'db' 카테고리의 다른 글
REGEXP_REPLACE 사용법 (0) | 2011.09.29 |
---|---|
oracle / mssql 테이블 스키마 보기 (0) | 2009.12.18 |
[ORACLE] ORA-01552 error (0) | 2009.10.05 |