• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PostgreSQL 对数组的遍历操作

    PostgreSQL 提供了数组类型。

    我来演示下如何具体使用

    创建一个有数组类型字段的表。

    create table test_array(id serial primary key, str1 int[][][]);

    插入两条测试数据。

    insert into test_array values (1,array[[[1,2],[3,4],[5,6]],[[20,30],[40,50],[70,100]]]);
    insert into test_array values (2,array[[[100,200],[300,400],[500,600]],[[2000,3000],[4000,5000],[7000,10000]]]);

    为了能直观的看到结果集,我们得把数组的值换成普通的类型拿出来, 有以下几种方法。

    不带分片的遍历,

    create or replace function sp_array2table_simple(
    anyarray
    )
    returns table (element int) as
    $ytt$
    declare array1 alias for $1;
     x int;
    begin
     drop table if exists tmp_1;
     create temporary table tmp_1 (id int);
     
     label1>> foreach x in array array1
     loop
     insert into tmp_1 values (x);
     end loop label1;
     
     return query select * from tmp_1;
    end;
    $ytt$ language plpgsql; 
     
    t_girl=#select sp_array2table_simple(str1) as array_list from test_array where id = 2; 
     
     array_list
    ------------
      100
      200
      300
      400
      500
      600
      2000
      3000
      4000
      5000
      7000
      10000
    (12 行记录) 
     
    时间:7.780 ms

    带分片的遍历:

    create or replace function sp_array2table(
    anyarray
    )
    returns table (element int) as
    $ytt$
    declare array1 alias for $1;
     x int[];
     nlen int := 0;
     i int := 1; 
    begin
     drop table if exists tmp_1;
     create temporary table tmp_1 (id int);
     
     label1>> foreach x slice 1 in array array1
     loop
      nlen := array_length(x,1);
      i := 1;
      label2>> while i = nlen loop
      insert into tmp_1 values (x[i]);
      i := i + 1;
      end loop label2;
     end loop label1;
     
     return query select * from tmp_1;
    end;
    $ytt$ language plpgsql; 
     
    t_girl=#select sp_array2table(str1) as array_list from test_array where id = 2; 
     
     array_list
    ------------
      100
      200
      300
      400
      500
      600
      2000
      3000
      4000
      5000
      7000
      10000
    (12 行记录) 
     
    时间:20.139 ms

    还有就是系统系统了几个函数,直接进行遍历,

    比如unnest

    t_girl=#select unnest(str1) as array_list from test_array where id = 2; 
     
     array_list
    ------------
      100
      200
      300
      400
      500
      600
      2000
      3000
      4000
      5000
      7000
      10000
    (12 行记录) 
     
    时间:1.002 ms

    比如array_to_string 等。

    t_girl=#select regexp_split_to_table(array_to_string(str1,','),',+') as array_list from test_array where id = 2;
     
     array_list
    ------------
     100
     200
     300
     400
     500
     600
     2000
     3000
     4000
     5000
     7000
     10000
    (12 行记录) 
     
    时间:0.850 ms

    补充:PostgreSQL遍历Json

    SQL:

    SELECT
     orderno,
     fromno,
     fromamount,
     fromlotno ->> 'index' fromlotno,
     othercondition ->> 'supplicode' supplicode,
     othercondition ->> 'downcode' downcode,
     othercondition ->> 'spec' spec,
     othercondition ->> 'carport' carport
    FROM
     (
     SELECT
     orderno,
     fromno,
     fromamount,
     json_array_elements (fromlotno) fromlotno,
     json_array_elements (othercondition) othercondition
     FROM
     t_feather_source
     ) A

    输出结果:

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    您可能感兴趣的文章:
    • 解决postgresql表中的字段名称包含特殊符号的问题
    • postgresql数据库使用说明_实现时间范围查询
    • postgresql 实现将数组变为行
    • PostgreSQL存储过程循环调用方式
    • postgresql 存储函数调用变量的3种方法小结
    • postgresql~*符号的含义及用法说明
    上一篇:PostgreSQL存储过程循环调用方式
    下一篇:postgresql 实现将数组变为行
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    PostgreSQL 对数组的遍历操作 PostgreSQL,对,数组,的,遍历,