2016-12-13 25 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単一の時間を使用している場合 レコードは、ファイル名を成功裏に挿入します。

私の質問は、FileUrlをv_FileUrl paramに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

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解決策の方向を示すためです。

関連する問題