展会信息港展会大全

PostgreSQL对数组的遍历
来源:互联网   发布日期:2016-02-17 13:50:02   浏览:8895次  

导读:PostgreSQL 提供了数组类型。我来演示下如何具体使用。 创建一个有数组类型字段的表。 ? 1 2 3 4 5 6 7 8 create table test_array(id serial primary key, str1 int[][][]); 插入两条测试数据。 insert into test_array values (1,array[[[1,2],[3,4],[5,6]...

PostgreSQL 提供了数组类型。我来演示下如何具体使用。

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

?

1

2

3

4

5

6

7

8

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

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

?

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

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 xin 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

47

48

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

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

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

t_girl=#selectregexp_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

赞助本站

人工智能实验室

相关热词: 开发 编程 android

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港