好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

PostgreSQL 对数组的遍历操作

PostgreSQL 提供了数组类型。

我来演示下如何具体使用

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

?

1

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

插入两条测试数据。

?

1

2

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]]]);

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

不带分片的遍历,

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

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

带分片的遍历:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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 等。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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

输出结果:

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

原文链接:https://blog.csdn.net/yueliangdao0608/article/details/18735703

查看更多关于PostgreSQL 对数组的遍历操作的详细内容...

  阅读:45次