设为首页 收藏本站
查看: 928|回复: 0

[经验分享] PostgreSQL数组使用(转载)

[复制链接]

尚未签到

发表于 2016-11-20 06:45:40 | 显示全部楼层 |阅读模式
开发的语言有数组的概念,对应于postgresql也有相关的数据字段类型,数组是英文array的翻译,可以定义一维,二维甚至更多维度,数学上跟矩阵很类似。在postgres里面可以直接存储使用,某些场景下使用很方便,也很强大。

环境:
OS:CentOS 6.2
DB: PostgreSQL 9.2.4

1.数组的定义
不一样的维度元素长度定义在数据库中的实际存储都是一样的,数组元素的长度和类型必须要保持一致,并且以中括号来表示。
合理的:
array[1,2]            --一维数组
array[[1,2],[3,5]]  --二维数组
'{99,889}'

不合理的:
array[[1,2],[3]]                     --元素长度不一致
array[[1,2],['Kenyon','good']]  --类型不匹配
[postgres@localhost ~]$ psql
psql (9.2.4)
Type "help" for help.
postgres=# create table t_kenyon(id serial primary key,items int[]);
NOTICE:  CREATE TABLE will create implicit sequence "t_kenyon_id_seq" for serial column "t_kenyon.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "t_kenyon_pkey" for table "t_kenyon"
CREATE TABLE
postgres=# \d+ t_kenyon
Table "public.t_kenyon"
Column |   Type    |                       Modifiers                       | Storage  | Stats target | Description
--------+-----------+-------------------------------------------------------+----------+--------------+-------------
id     | integer   | not null default nextval('t_kenyon_id_seq'::regclass) | plain    |              |
items  | integer[] |                                                       | extended |              |
Indexes:
"t_kenyon_pkey" PRIMARY KEY, btree (id)
Has OIDs: no
postgres=# create table t_ken(id serial primary key,items int[4]);
NOTICE:  CREATE TABLE will create implicit sequence "t_ken_id_seq" for serial column "t_ken.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "t_ken_pkey" for table "t_ken"
CREATE TABLE
postgres=# \d+ t_ken
                                              Table "public.t_ken"
 Column |   Type    |                     Modifiers                      | Storage  | Stats target | Description 
--------+-----------+----------------------------------------------------+----------+--------------+-------------
 id     | integer   | not null default nextval('t_ken_id_seq'::regclass) | plain    |              | 
 items  | integer[] |                                                    | extended |              | 
Indexes:
    "t_ken_pkey" PRIMARY KEY, btree (id)
Has OIDs: no
数组的存储方式是extended的。
2.数组操作
a.数据插入,有两种方式
postgres=# insert into t_kenyon(items) values('{1,2}');
INSERT 0 1
postgres=# insert into t_kenyon(items) values('{3,4,5}');
INSERT 0 1
postgres=# insert into t_kenyon(items) values(array[6,7,8,9]);
INSERT 0 1
postgres=# select * from t_kenyon;
id |   items  
----+-----------
1 | {1,2}
2 | {3,4,5}
3 | {6,7,8,9}
(3 rows)
b.数据删除
postgres=# delete from t_kenyon where id = 3;
DELETE 1
postgres=# delete from t_kenyon where items[1] = 4;
DELETE 0
postgres=# delete from t_kenyon where items[1] = 3;
DELETE 1
c.数据更新
往后追加
postgres=# update t_kenyon set items = items||7;
UPDATE 1
postgres=# select * from t_kenyon;
id |  items
----+---------
1 | {1,2,7}
(1 row)
postgres=# update t_kenyon set items = items||'{99,66}';
UPDATE 1
postgres=# select * from t_kenyon;
id |      items      
----+------------------
1 | {1,2,7,55,99,66}
(1 row)
往前插
postgres=# update t_kenyon set items = array_prepend(55,items) ;
UPDATE 1
postgres=# select * from t_kenyon;
id |        items      
----+---------------------
1 | {55,1,2,7,55,99,66}
(1 row)
d.数据查询
postgres=# insert into t_kenyon(items) values('{3,4,5}');
INSERT 0 1
postgres=# select * from t_kenyon where id = 1;
id |        items      
----+---------------------
1 | {55,1,2,7,55,99,66}
(1 row)
postgres=# select * from t_kenyon where items[1] = 55;
id |        items      
----+---------------------
1 | {55,1,2,7,55,99,66}
(1 row)
postgres=# select * from t_kenyon where items[3] = 5;
id |  items
----+---------
4 | {3,4,5}
(1 row)
postgres=# select items[1],items[3],items[4] from t_kenyon;
items | items | items
-------+-------+-------
55 |     2 |     7
3 |     5 |     
(2 rows)
postgres=# select unnest(items) from t_kenyon where id = 4;
unnest
--------
3
4
5
(3 rows)
e.数组比较
postgres=# select ARRAY[1,2,3] <= ARRAY[1,2,3];
?column?
----------
t
(1 row)
f.数组字段类型转换
postgres=# select array[['11','12'],['23','34']]::int[];
array      
-------------------
{{11,12},{23,34}}
(1 row)
postgres=# select array[[11,12],[23,34]]::text[];
array      
-------------------
{{11,12},{23,34}}
(1 row)
3.数组索引
postgres=# create table t_kenyon(id int,items int[]);
CREATE TABLE
postgres=# insert into t_kenyon values(1,'{1,2,3}');
INSERT 0 1
postgres=# insert into t_kenyon values(1,'{2,4}');
INSERT 0 1
postgres=# insert into t_kenyon values(1,'{34,7,8}');
INSERT 0 1
postgres=# insert into t_kenyon values(1,'{99,12}');
INSERT 0 1
postgres=# create index idx_t_kenyon on t_kenyon using gin(items);
CREATE INDEX
postgres=# set enable_seqscan = off;
postgres=# explain select * from t_kenyon where items@>array[2];
QUERY PLAN                                 
---------------------------------------------------------------------------
Bitmap Heap Scan on t_kenyon  (cost=8.00..12.01 rows=1 width=36)
Recheck Cond: (items @> '{2}'::integer[])
->  Bitmap Index Scan on idx_t_kenyon  (cost=0.00..8.00 rows=1 width=0)
Index Cond: (items @> '{2}'::integer[])
(4 rows)

附数组操作符:

Operator
Description
Example
Result

=
equal
ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3]
t


<>
not equal
ARRAY[1,2,3] <> ARRAY[1,2,4]
t


<
less than
ARRAY[1,2,3] < ARRAY[1,2,4]
t


>
greater than
ARRAY[1,4,3] > ARRAY[1,2,4]
t


<=
less than or equal
ARRAY[1,2,3] <= ARRAY[1,2,3]
t


>=
greater than or equal
ARRAY[1,4,3] >= ARRAY[1,4,3]
t


@>
contains
ARRAY[1,4,3] @> ARRAY[3,1]
t


<@
is contained by
ARRAY[2,7] <@ ARRAY[1,7,4,2,6]
t


&&
overlap (have elements in common)
ARRAY[1,4,3] && ARRAY[2,1]
t


||
array-to-array concatenation
ARRAY[1,2,3] || ARRAY[4,5,6]
{1,2,3,4,5,6}


||
array-to-array concatenation
ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]]
{{1,2,3},{4,5,6},{7,8,9}}


||
element-to-array concatenation
3 || ARRAY[4,5,6]
{3,4,5,6}


||
array-to-element concatenation
ARRAY[4,5,6] || 7
{4,5,6,7}



数组函数:

Function
Return Type
Description
Example
Result

array_append(anyarray, anyelement)
anyarray
append an element to the end of an array
array_append(ARRAY[1,2], 3)
{1,2,3}


array_cat(anyarray, anyarray)
anyarray
concatenate two arrays
array_cat(ARRAY[1,2,3], ARRAY[4,5])
{1,2,3,4,5}


array_ndims(anyarray)
int
returns the number of dimensions of the array
array_ndims(ARRAY[[1,2,3], [4,5,6]])
2


array_dims(anyarray)
text
returns a text representation of array's dimensions
array_dims(ARRAY[[1,2,3], [4,5,6]])
[1:2][1:3]


array_fill(anyelement, int[], [, int[]])
anyarray
returns an array initialized with supplied value and dimensions, optionally with lower bounds other than 1
array_fill(7, ARRAY[3], ARRAY[2])
[2:4]={7,7,7}


array_length(anyarray, int)
int
returns the length of the requested array dimension
array_length(array[1,2,3], 1)
3


array_lower(anyarray, int)
int
returns lower bound of the requested array dimension
array_lower('[0:2]={1,2,3}'::int[], 1)
0


array_prepend(anyelement, anyarray)
anyarray
append an element to the beginning of an array
array_prepend(1, ARRAY[2,3])
{1,2,3}


array_to_string(anyarray, text [, text])
text
concatenates array elements using supplied delimiter and optional null string
array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*')
1,2,3,*,5


array_upper(anyarray, int)
int
returns upper bound of the requested array dimension
array_upper(ARRAY[1,8,3,7], 1)
4


string_to_array(text, text [, text])
text[]
splits string into array elements using supplied delimiter and optional null string
string_to_array('xx~^~yy~^~zz', '~^~', 'yy')
{xx,NULL,zz}


unnest(anyarray)
setof anyelement
expand an array to a set of rows
unnest(ARRAY[1,2])

1
2

(2 rows)


 
参考:http://www.postgresql.org/docs/9.2/static/functions-array.html

原文地址:http://my.oschina.net/Kenyon/blog/133974

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-302594-1-1.html 上篇帖子: db PostgreSQL 8.2.3 下篇帖子: PostgreSQL+PostGIS的使用 2
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表