postgresql里边的数组怎么 *** 作

postgresql里边的数组怎么 *** 作,第1张

1. 数组可以作为字段类型

PostgreSQL中数据是一种基本的数据类型,可以作为字段的类型定义。例如,

CREATE TABLE ads.tb_mo_item

(

  mo_key integer NOT NULL,

 input_flow integer[] NOT NULL DEFAULT ARRAY[]::integer[] 

)

2. 可以用array[]来初始化一个数组

select array[1, 3, 4]::int[]

3. *** 作数组有一系列函数, 可以实现数组比较,添加新元素,一般数组是否包含另一数组的判断,等等。具体参考PostgreSQL说明文档中函数和 *** 作符中有关Array的部分。

*** 作符有: =, <>, <, >, >=, <=, @>, @<, &&, ||

函数有: array_append, array_cat, array_ndims, array_dims, array_fill, array_length, array_lower, array_remove, array_replace, array_to_string, array_upper, string_to_array, unnest等.

其中,常用的是: array_append,  array_length, unnest

4. 使用数组下标获得数组的元素,下标是从1开始的

select (array[1, 3, 4]::int[])[2]

5. 可以用unnest将数组转换成一个结果集,个人觉得这个很有用处

select a.a from unnest(array[1, 3, 4]::int[]) a

https://www.cnblogs.com/alianbog/p/5665411.html

postgresql支持数组类型,可以是基本类型,也可以是用户自定义的类型。日常中使用数组类型的机会不多,但还是可以了解一下。不像C或JAVA高级语言的数组下标从0开始,postgresql数组下标从1开始,既可以指定长度,也可以不指定长度。且postgresql既支持一维数组,也支持多维数组,但是平时二维数组也就够用了。

示例1.使用ARRAY构建数组类型

---1*4的一维数组test=#selectarray[1,2,3,4]

  array  -----------{1,2,3,4}

(1 row)--2*2的二维数组test=#selectarray[[1,2],[3,4]]

    array    ---------------{{1,2},{3,4}}

(1 row)--1*2的二维数组,基本类型为box矩形类型,且和上面相比box类型元素之间是以分号分隔的,其他所有类型的数据都是以逗号分隔的test=#selectarray[box'(1,1),(0,0)',box'(0,0),(-1,-1)']

            array            -----------------------------{(1,1),(0,0)(0,0),(-1,-1)}

(1row)

示例2.创建一张表,字段包含数组类型

其中int[]表示数组长度无限制,int[4]表示数组长度为4.

test=#createtabletbl_array(aint[],bvarchar(32)[][],cint)CREATETABLEtest=#insertintotbl_array (a,b,c)values(array[1,2],array[[1,2,3],[4,5,6]],1)INSERT01test=#insertintotbl_array (a,b,c)values(array[1,2,3],array[[1,2],[4,5]],2)INSERT01test=#select*from tbl_array

    a    |b| c ---------+-------------------+---{1,2}|{{1,2,3},{4,5,6}}|1 {1,2,3}|{{1,2},{4,5}}|2(2 rows)

test=#selecta[1],b[2]fromtbl_arraywherec=1

a | b ---+---1|

(1 row)

test=#selecta[1],b[2][1]fromtbl_arraywherec=1

a | b ---+---1|4(1 row)

test=#selecta[1],b[2][4]fromtbl_arraywherec=1

a | b ---+---1|

(1row)

test=#updatetbl_arrayseta[1]=200wherea[1]=1UPDATE1test=#selecta[1],b[2][4]from tbl_array

  a  | b -----+---100|200|

(2rows)

也可以使用[下标:上标]方式来查询数组连续的某些元素。

test=#selecta[2:3]from tbl_array

  a  -------{2}

{2,3}

(2 rows)

test=#selecta[1:3]from tbl_array

    a    -----------{100,2}

{200,2,3}

(2rows)

数组 *** 作符与函数

*** 作符

*** 作符描述示例结果

=相等 SELECT ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3] t

<>不等于 select ARRAY[1,2,3] <>ARRAY[1,2,4] t

<小于 select ARRAY[1,2,3] <ARRAY[1,2,4] t

>大于 select ARRAY[1,4,3] >ARRAY[1,2,4] t

<=小于或等于 select ARRAY[1,2,3] <= ARRAY[1,2,3] t

>=大于或等于 select ARRAY[1,4,3] >= ARRAY[1,4,3] t

@>包含 select ARRAY[1,4,3] @>ARRAY[3,1] t

<@包含于 select ARRAY[2,7] <@ ARRAY[1,7,4,2,6] t

&&重叠(是否有相同元素) select ARRAY[1,4,3] &&ARRAY[2,1] t

||数组与数组连接 select ARRAY[1,2,3] || ARRAY[4,5,6] {1,2,3,4,5,6}

||数组与数组连接 select ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]] {{1,2,3},{4,5,6},{7,8,9}}

||元素与数组连接 select 3 || ARRAY[4,5,6] {3,4,5,6}

||数组与元素连接 select ARRAY[4,5,6] || 7 {4,5,6,7}

函数

函数返回类型描述示例结果

array_append(anyarray,anyelement)anyarray 在数组末尾追加元素 

SELECT array_append(ARRAY[1,2], 3)

 {1,2,3}

array_cat(anyarray,anyarray)anyarray 连接两个数组 SELECT array_cat(ARRAY[1,2,3], ARRAY[4,5]) {1,2,3,4,5}

array_ndims(anyarray)int 返回数组维数 SELECT array_ndims(ARRAY[[1,2,3], [4,5,6]]) 2

array_dims(anyarray)text 返回数组维数的文本表示 SELECT array_dims(ARRAY[[1,2,3], [4,5,6]]) [1:2][1:3]

array_fill(anyelement,int[], [,int[]])anyarray使用提供的值和维度初始化一个数组,其中anyelement是值,第一个int[]是数组的长度,第二个int[]是数组下界,下界默认是1 SELECT array_fill(7, ARRAY[3], ARRAY[2]) [2:4]={7,7,7}

array_length(anyarray,int)int 返回数组指定维度的长度 SELECT array_length(array[1,2,3], 1) 3

array_lower(anyarray,int)int 返回数组指定维度的下界 SELECT array_lower('[0:2]={1,2,3}'::int[], 1) 0

array_position(anyarray,anyelement[,int])int 返回数组元素anyelement从数组的[,int]位置(默认为1)开始第一次出现在数组中的位置,数组必须是一维的 SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon') 2

array_positions(anyarray,anyelement)int[] 返回元素在数组中的所有位置 SELECT array_positions(ARRAY['A','A','B','A'], 'A') {1,2,4}

array_prepend(anyelement,anyarray)anyarray 在数组开头添加新的元素 SELECT array_prepend(1, ARRAY[2,3]) {1,2,3}

array_remove(anyarray,anyelement)anyarray 从数组中删除所有的指定元素,必须是一维数组 SELECT array_remove(ARRAY[1,2,3,2], 2) {1,3}

array_replace(anyarray,anyelement,anyelement)anyarray 替换指定数组元素为新的元素 SELECT array_replace(ARRAY[1,2,5,4], 5, 3) {1,2,3,4}

array_to_string(anyarray,text[,text])text 将数组元素使用分隔符连接为文本,NULL可以使用指定元素替换 SELECT array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*') 1,2,3,*,5

array_upper(anyarray,int)int 数组指定维度的上届 SELECT array_upper(ARRAY[1,8,3,7], 1) 4

cardinality(anyarray)int 返回数组所有维度的长度总和,如果是空数组则返回0 SELECT cardinality(ARRAY[[1,2],[3,4]]) 4

string_to_array(text,text[,text])text[] 将文本使用分隔符分隔后转换为数组,如果指定第三个参数,则第三个参数在数组中被转换为NULL SELECT string_to_array('xx~^~yy~^~zz', '~^~', 'yy') {xx,NULL,zz}

unnest(anyarray)setof anyelement 将数组元素转换为行 SELECT unnest(ARRAY[1,2]) 

1

2

unnest(anyarray,anyarray[, ...])setof anyelement, anyelement [, ...] 将多维数组转换为行集合,其中第一个数组显示为第一列,第二个数组显示为第二列,以此类推。但是这个函数只在from子句中使用 SELECT * from unnest(ARRAY[1,2],ARRAY['foo','bar','baz']) 

unnest | unnest

--------+----

1 | foo

2 | bar

  | baz


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11835713.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-19
下一篇2023-05-19

发表评论

登录后才能评论

评论列表(0条)

    保存