PostgreSQL数组使用
发布时间:2020-12-13 17:12:42 所属栏目:百科 来源:网络整理
导读:开发的语言有数组的概念,对应于postgresql也有相关的数据字段类型,数组是英文array的翻译,可以定义一维,二维甚至更多维度,数学上跟矩阵很类似。在postgres里面可以直接存储使用,某些场景下使用很方便,也很强大。 环境: OS:CentOS 6.2 DB: PostgreSQ
开发的语言有数组的概念,对应于postgresql也有相关的数据字段类型,数组是英文array的翻译,可以定义一维,二维甚至更多维度,数学上跟矩阵很类似。在postgres里面可以直接存储使用,某些场景下使用很方便,也很强大。
环境: OS:CentOS 6.2 DB: PostgreSQL 9.2.4 1.数组的定义 不一样的维度元素长度定义在数据库中的实际存储都是一样的,数组元素的长度和类型必须要保持一致,并且以中括号来表示。 合理的: array[1,2] --一维数组 array[[1,2],[3,5]] --二维数组 '{99,889}' 不合理的: [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,5} 3 | {6,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 1c.数据更新 往后追加 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,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,66} (1 row)d.数据查询 postgres=# insert into t_kenyon(items) values('{3,5}'); INSERT 0 1 postgres=# select * from t_kenyon where id = 1; id | items ----+--------------------- 1 | {55,66} (1 row) postgres=# select * from t_kenyon where items[1] = 55; id | items ----+--------------------- 1 | {55,66} (1 row) postgres=# select * from t_kenyon where items[3] = 5; id | items ----+--------- 4 | {3,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,3] <= ARRAY[1,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,34}} (1 row)3.数组索引 postgres=# create table t_kenyon(id int,items int[]); CREATE TABLE postgres=# insert into t_kenyon values(1,'{1,3}'); INSERT 0 1 postgres=# insert into t_kenyon values(1,'{2,4}'); INSERT 0 1 postgres=# insert into t_kenyon values(1,'{34,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) 附数组操作符:
数组函数: Function | Return Type | array_append(anyarray,anyelement) | anyarray | append an element to the end of an array | array_append(ARRAY[1,3) | {1,3} | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
array_cat(anyarray,anyarray) | anyarray | concatenate two arrays | array_cat(ARRAY[1,3],ARRAY[4,5]) | array_ndims(anyarray) | int | returns the number of dimensions of the array | array_ndims(ARRAY[[1,[4,6]]) | 2 | ||||||||||||||||||||||||||||||||||
array_dims(anyarray) | text | returns a text representation of array's dimensions | array_dims(ARRAY[[1,248)">[1:2][1:3] | |||||||||||||||||||||||||||||||||||||||
array_fill(anyelement,int[],[,int[]]) | 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} | |||||||||||||||||||||||||||||||||||||||
array_length(anyarray,int) | returns the length of the requested array dimension | array_length(array[1,1) | 3 | |||||||||||||||||||||||||||||||||||||||
array_lower(anyarray,248)">returns lower bound of the requested array dimension | array_lower('[0:2]={1,3}'::int[],248)">0 | |||||||||||||||||||||||||||||||||||||||||
array_prepend(anyelement,248)">append an element to the beginning of an array | array_prepend(1,ARRAY[2,3]) | array_to_string(anyarray,text[,text]) | concatenates array elements using supplied delimiter and optional null string | array_to_string(ARRAY[1,NULL,5],','*') | 1,*,5 | |||||||||||||||||||||||||||||||||||||
array_upper(anyarray,248)">returns upper bound of the requested array dimension | array_upper(ARRAY[1,7],248)">4 | |||||||||||||||||||||||||||||||||||||||||
string_to_array(text,248)">text[] | splits string into array elements using supplied delimiter and optional null string | string_to_array('xx~^~yy~^~zz','~^~','yy') | {xx,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
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
相关内容
- c# – .Net中的Dictionary可能会在并行阅读和写入时造成死锁
- com.alibaba.fastjson.JSONException: create instanc
- ruby-on-rails – 资产管道导轨3
- ruby-on-rails – JBuilder从视图调用to_builder
- c# – System.Runtime.InteropServices.COMException(0x800
- cocos2d-x游戏开发(二)之创建第一个项目
- vue 2.x 中axios 封装的get 和post方法
- 如何在WPF C#4.0中构建放大镜?
- C#和Python之间的核心概念差异有哪些?
- 数字类正则表达式