2009-09-08 4 views

답변

1

Postgres 8.4 (물론 8.3도 그렇습니다)에서는 regexp_split_to_table을 사용할 수 있습니다. 그러나이 작업은 8.1 용으로도 필요했습니다.

이 확인을 작동하는 것 같다 :

create or replace function split_xmcuser_groups_to_tuples() RETURNS SETOF RECORD AS $$ 
DECLARE 
    r a%rowtype; 
    strLen integer; 
    curIdx integer; 
    commaCnt integer; 
    curCSV varchar; 
BEGIN 
    curIdx := 1; 
    commaCnt := 1; 
    FOR r IN SELECT * FROM a 
    LOOP 
     strLen := char_length(r.csv); 
     while curIdx <= strLen LOOP 
      curIdx := curIdx + 1; 
      if substr(r.csv, curIdx, 1) = ',' THEN 
       commaCnt := commaCnt + 1; 
      END IF; 
     END LOOP; 
     curIdx := 1; 
     while curIdx <= commaCnt LOOP 
      curCSV := split_part(r.csv, ',', curIdx); 
      if curCSV != '' THEN 
       RETURN QUERY select r.a,curCSV; 
      END IF; 
      curIdx := curIdx + 1; 
     END LOOP; 
    END LOOP; 
    RETURN; 
END 
$$ LANGUAGE 'plpgsql'; 

(그리고 예, 성능에 미치는 영향과이 작업을 수행하지 않는 이유에 대해 알고)

0

나는이 응용 프로그램 코드의 경우에 처리되어야한다고 말할 것 가능한. 그것은 CSV 필드이기 때문에 항목 수는 작다고 가정합니다. 예를 들어, 데이터베이스 행당 < 1000입니다. 따라서 메모리 및 CPU 비용은 쉼표로 분리하여 필요에 따라 반복하는 것이 금지되지 않습니다.

응용 프로그램 대신 포스트그레스에서이 작업을 수행해야하는 이유가 있습니까? 그렇다면 psql 프로 시저를 작성하여 각 행을 분할 한 결과를 임시 테이블에 채울 수 있습니다. 다음은 쉼표 분리를 사용하는 예입니다. http://archives.postgresql.org/pgsql-novice/2004-04/msg00117.php

관련 문제