繁体   English   中英

PgSql插入具有多个regexp_split_to_table的多个记录

[英]PgSql Insert multiple records with multiple regexp_split_to_table

我有一个带有列[FileId,FileName,FileUrl]的表。 我在INSERT存储过程的输入参数中将FileName和FileUrl作为逗号分隔的字符串(v_FileName,v_FileUrl),并且FileId自动提示。 如果我一次使用regexp_split_to_table,则记录将成功插入FileName,如下所示:

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

如上面的测试脚本中所示,这成功地为v_FileName参数中的所有文件名插入了行,并为fileurl设置了“ testurl”。

我的查询是,是否也可以在这种情况下使用regexp_split_to_table为v_FileUrl参数设置FileUrl? 我试过,但给出了错误“ regexp_split_to_table被多次使用”的错误。 (可能是我没有正确使用它。)

或建议我以其他方式插入带有此类输入参数的记录。

提前致谢。

一种选择是对regexp_split_to_array使用unnest

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值)。

如果需要将逗号分隔的字符串存储到多行中。 您可以检查以下代码;

逗号分隔的字符串-“ 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

根据我的期望,远低于解决方案为我工作。 提供扩展MYTABLE的解决方案,因为我的实际表包含更多列。 而且,这对于具有相同要求的其他人会更有用。

列:

FileId, StoryId, FileName, FileHref, InsertDate

插入存储的带有示例值的proc输入参数:

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

但是,当前将regexp_split_to_table()与unnest()一起使用时感觉很糟糕,但是就我而言,用逗号分隔的值可能不会增加到30,因此该代码段应该可以。 目前,我是pgsql的新手,但是如果有人有更好/更好的解决方案,那么一定会赞赏。

感谢@jcaron显示解决方案的方向。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM