PgSql 用多个regexp_split_to_table插入多条记录

问题描述 投票:0回答:3

我有一个带有列的表格

[FileId, FileName, FileUrl]

我在 INSERT 存储过程的输入参数中得到

FileName
FileUrl
作为逗号分隔的字符串 (
v_FileName
,
v_FileUrl
),并且
FileId
是自动递增的。

如果我使用

FileName

 一次,
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',')
这将成功在 

v_FileName

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

我的问题是,是否也可以在这样的单次操作中使用

regexp_split_to_table

 来设置 FileUrl 为 
v_FileUrl
 参数?

我尝试过,但出现错误

regexp_split_to_table 被多次使用

(可能是我没有正确使用)

或者建议我使用任何其他方式插入具有此类输入参数的记录。

提前致谢。

postgresql multiple-columns sql-insert bulkinsert
3个回答
1
投票
一种选择是将

unnest

regexp_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
投票
如果您需要将逗号分隔字符串存储到多行中。您可以检查下面的代码;

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

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

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指出了解决方案的方向。

© www.soinside.com 2019 - 2024. All rights reserved.