2016-12-13 4 views
0

[FileId, FileName, FileUrl] 열이있는 테이블이 있습니다. FileName과 FileUrl을 쉼표로 구분 된 문자열 (v_FileName, v_FileUrl)로 가져옵니다. 내 INSERT 저장 프로 시저의 입력 매개 변수에는 FileId가 자동 증가됩니다.PgSql 여러 regexp_split_to_table을 사용하여 여러 레코드 삽입

INSERT INTO MYTABLE 
    SELECT nextval('mytable_fileid_seq'), 
    ,regexp_split_to_table 
    ,'testurl' 
    FROM regexp_split_to_table(v_FileName, E',') 

이 성공적으로 위의 테스트 스크립트와 같이 fileurl에 대한 v_FileName의 PARAM 및 설정 'testurl'에있는 모든 파일 이름에 대한 행을 삽입 다음과 같이 내가 regexp_split_to_table 한 시간을 사용하는 경우 기록은 파일 이름을 성공적으로 삽입합니다.

내 쿼리는 File_Role을 v_FileUrl 매개 변수에도 regexp_split_to_table을 사용하여 설정할 수 있습니까? 나는 시도했다. 그러나 그것은 "regexp_split_to_table이 두 번 이상 사용되었다"라는 에러를 주었다. (제대로 사용하지 않았습니까?)

또는 입력 매개 변수가있는 레코드를 삽입하는 다른 방법을 제안합니다.

미리 감사드립니다.

+1

달성하려는 목표가 명확하지 않습니다. 입력 예와 얻을 수있는 것을 제공 할 수 있습니까? 당신이 여러 개의 파일 이름, 몇 개의 URL, 각 하나씩을 얻으면 나는 확신하지 못한다. – jcaron

+0

확인. 내가 언급 한 것처럼 텍스트 형식의 입력 매개 변수가 2 개있는 함수가 있다고 가정합니다. param v_FileName은 'file1.jpeg, file2.pdf, file3.doc'값을 포함 할 수 있습니다. 동시에 v_FileUrl에는 'www.abc.com/file1.jpeg,www.abc.com/file2.pdf,www.file3.doc'이 포함될 수 있습니다. 이 데이터로 코드는 각 열에 해당 값이있는 테이블에 3 행을 삽입해야합니다. –

답변

1

하나의 옵션은 사용하는 것입니다 unnestregexp_split_to_array과 :

SELECT * FROM unnest(
    regexp_split_to_array('a,b,c',','), 
    regexp_split_to_array('1,2,3',',') 
); 

결과 :

unnest | unnest 
--------+-------- 
a  | 1 
b  | 2 
c  | 3 

귀하의 경우 :

INSERT INTO mytable (FileName, FileUrl) 
SELECT * 
FROM unnest(
    regexp_split_to_array(v_FileName,','), 
    regexp_split_to_array(v_FileUrl,',') 
); 

(FileId가 시퀀스를 사용하여 적절한 default 값을 가지고 있다고 가정합니다.)

0

문자열을 쉼표로 구분하여 여러 행에 저장해야하는 경우. 아래 코드를 확인할 수 있습니다.

쉼표 문자열 sepearated - "1,2,3,4,5,6"을

create table schema_name.table_name(id int); 

insert into schema_name.table_name 
(
SELECT CAST(regexp_split_to_table('1,2,3,4,5,6', ',') AS INTEGER) AS id 
) ; 

select * from schema_name.table_name 
0

정확히 내가 예상 한 바에 따르면 솔루션 아래에 저에게 도움이되었습니다. MYTABLE을 실제 테이블로 확장하는 솔루션에는 더 많은 열이 포함됩니다. 또한 동일한 요구 사항을 가진 다른 사람들에게도 더 도움이 될 것입니다.

컬럼 : 샘플 값

FileId, StoryId, FileName, FileHref, InsertDate 

INSERT 저장된 프로 시저 입력 PARAMS :

v_StoryId = 5678, 
v_FileName = 'File_1.jpg,File_2.pdf,File_3.jpg,File_4.pdf' 
v_FileHref = 'www.abc.com/File_1.jpg,www.abc.com/File_2.pdf,www.abc.com/File_3.jpg,www.abc.com/File_4.pdf' 

코드 블록 작동 :

INSERT INTO MYTABLE 
(SELECT NextVal('mytable_fileid_seq') 
     ,v_StoryId 
     ,FileName.regexp_split_to_table   
     ,FileHref.regexp_split_to_table 
     ,LOCALTIMESTAMP 
     FROM ( select row_number() over() as idx, 
        i as regexp_split_to_table 
        from UNNEST(STRING_TO_ARRAY(v_FileName,',')) i 
       )as FileName 
       JOIN ( select row_number() over() as idx, 
         i as regexp_split_to_table 
         from UNNEST(string_to_array(v_FileHref,',')) i 
         )as FileHref 
       ON FileName.idx = FileHref.idx 
       ); 

결과 :

FileId | StoryId | FileName |FileHref  |InsertDate 
-------------------------------------------------------------------------------------------- 
23  | 1234  |File_1.jpg |www.abc.com/File_1.jpg | 2016-12-14 12:11:54.374933 
-------------------------------------------------------------------------------------------- 
24  | 1234  |File_2.pdf |www.abc.com/File_2.pdf | 2016-12-14 12:11:54.374933 
-------------------------------------------------------------------------------------------- 
25  | 1234  |File_3.jpg |www.abc.com/File_3.jpg | 2016-12-14 12:11:54.374933 
-------------------------------------------------------------------------------------------- 
26  | 1234  |File_4.pdf |www.abc.com/File_4.pdf | 2016-12-14 12:11:54.374933 

그러나 현재 unnest()와 함께 regexp_split_to_table()을 사용하면 좋지 않지만 필자의 경우와 같이 쉼표로 구분 된 값은 30으로 증가하지 않을 수 있으므로 스 니펫은 정상이어야합니다. 현재 pgsql에 익숙하지 않지만 누군가가 더 나은/깔끔한 솔루션을 제공한다면 분명히 감사 할 것입니다.

감사의 말 : jcaron 솔루션 방향을 제시했습니다.