2016-06-13 2 views
0

그래서 나는Csv 문자열을 분할 한 결과를 루프하는 방법?

test = 'a,b,c,d'; 

내가 쉼표 (,)로 deliminated 각 단어들로이 문자열을 분할 할 문자열을 가지고있다. 그런 다음 결과를 반복합니다.

나는이 솔루션을 보았다 :

WITH t AS 
(SELECT 'a,b,c,d,e' AS txt FROM dual 
) 
SELECT CAST(REGEXP_SUBSTR (txt, '[^,]+', 1, level) AS CHAR(12)) 
FROM t 
CONNECT BY level <= LENGTH(regexp_replace(txt,'[^,]*'))+1; 

그러나, 결과 집합 루프에 저를 허용하지 않습니다. 각 부분 문자열을 처리해야하는 추가 처리가 있습니다.

어떻게이 결과 집합을 반복 할 수 있습니까?

+0

FOR 루프를 사용해 보셨습니까? –

+5

다른 것과 마찬가지로 결과 세트를 반복 할 수 있습니다. 왜 그걸 감당할 수 없다고 생각하니? 어떤 이유로 작동하지 않는 코드가있는 경우 오류가 발생한 것과 함께 질문에 추가하십시오. –

답변

1

당신은 당신의 쿼리를 인라인 뷰를 사용할 수 있습니다

WITH t AS (
    SELECT 'a,b,c,d,e' AS txt FROM dual 
) 
SELECT extra_processing(value) 
FROM (
    SELECT CAST(REGEXP_SUBSTR (txt, '[^,]+', 1, level) AS CHAR(12)) AS value 
    FROM t 
    CONNECT BY level <= LENGTH(regexp_replace(txt,'[^,]*'))+1 
); 

을이이 PL/SQL로 태그되어 있기 때문에 - 모든 SQL 사용하는 이유 :

오라클 설치 :

을 구분 기호에 문자열을 분할하는 작은 도우미 함수 :

CREATE OR REPLACE FUNCTION split_String(
    i_str IN VARCHAR2, 
    i_delim IN VARCHAR2 DEFAULT ',' 
) RETURN SYS.ODCIVARCHAR2LIST DETERMINISTIC 
AS 
    p_result  SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST(); 
    p_start  NUMBER(5) := 1; 
    p_end   NUMBER(5); 
    c_len CONSTANT NUMBER(5) := LENGTH(i_str); 
    c_ld CONSTANT NUMBER(5) := LENGTH(i_delim); 
BEGIN 
    IF c_len > 0 THEN 
    p_end := INSTR(i_str, i_delim, p_start); 
    WHILE p_end > 0 LOOP 
     p_result.EXTEND; 
     p_result(p_result.COUNT) := SUBSTR(i_str, p_start, p_end - p_start); 
     p_start := p_end + c_ld; 
     p_end := INSTR(i_str, i_delim, p_start); 
    END LOOP; 
    IF p_start <= c_len + 1 THEN 
     p_result.EXTEND; 
     p_result(p_result.COUNT) := SUBSTR(i_str, p_start, c_len - p_start + 1); 
    END IF; 
    END IF; 
    RETURN p_result; 
END; 
/
(210)

코드 :

DECLARE 
    list SYS.ODCIVARCHAR2LIST := split_String('a,b,c,d,e'); 
BEGIN 
    FOR i IN 1 .. list.LAST LOOP 
    -- do your extra processing 
    END LOOP; 
END; 
/

하거나 SQL에서 그것을 할 만 할 수

SELECT extra_processing(COLUMN_VALUE) 
FROM TABLE(split_String('a,b,c,d,e')) 

(참고 :. COLUMN_VALUE는 오라클이 TABLE 운영자에 의해 생성 된 값에 제공하는 열 이름)

관련 문제