【问题标题】:PgSql Insert multiple records with multiple regexp_split_to_tablePgSql 使用多个 regexp_split_to_table 插入多条记录
【发布时间】:2016-12-13 12:33:43
【问题描述】:

我有一个包含 [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 is used more than once”之类的错误。 (可能是我没有正确使用它。)

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

提前致谢。

【问题讨论】:

  • 目前还不清楚您要达到的目标。您能否提供一个输入示例,以及您期望得到什么?我不太确定你是否得到了几个文件名、几个 url,每个......?
  • 好的。假设我有一个带有 2 个文本类型输入参数的函数,如前所述。参数 v_FileName 可能包含值:'file1.jpeg,file2.pdf,file3.doc'。同时 v_FileUrl 可能有:'www.abc.com/file1.jpeg,www.abc.com/file2.pdf,www.file3.doc'。使用此数据,代码应在表中插入 3 行,并在相应的列中插入相应的值。

标签: postgresql multiple-columns bulkinsert insert-into


【解决方案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 值)。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      下面的解决方案完全符合我的预期。由于我的实际表包含更多列,因此提供扩展 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,所以 sn-p 应该没问题。目前我是 pgsql 的新手,但如果有人有更好/简洁的解决方案,那么当然不胜感激。

      感谢@jcaron 指明解决方案的方向。

      【讨论】:

        猜你喜欢
        • 2011-07-05
        • 1970-01-01
        • 1970-01-01
        • 2015-09-25
        • 2016-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多