https://www.postgresql.org/docs/14/arrays.html


添加

INSERT INTO sal_emp
    VALUES ('Bill',
    '{10000, 10000, 10000, 10000}',
    '{{"meeting", "lunch"}, {"training", "presentation"}}');

更新

-- 更新
UPDATE sal_emp SET pay_by_quarter = '{25000,25000,27000,27000}'
    WHERE name = 'Carol';
    
-- 使用Array更新
UPDATE sal_emp SET pay_by_quarter = ARRAY[25000,25000,27000,27000]
    WHERE name = 'Carol';

-- 更新数组中的某个值(注意,下标是从1开始)
UPDATE sal_emp SET pay_by_quarter[4] = 15000
    WHERE name = 'Bill';
    

-- 更新一片 a alice(范围)

UPDATE sal_emp SET pay_by_quarter[1:2] = '{27000,27000}'
    WHERE name = 'Carol';

-- 添加一个标签
-- update blog set tags = array_append(tags, '程序员'::text) where id=1

-- 删除标签
-- update blog set tags = array_remove(tags, '开源'::text) where id=3

查询

使用any、all进行查询

SELECT * FROM customertag c WHERE '无生日' = any(c.tags)

SELECT * FROM customertag c WHERE '无生日' <> all(c.tags)

any

  • > any  大于子查询结果中的某个值
  • < any  小于子查询结果中的某个值
  • >= any 大于或等于子查询结果中的某个值
  • <= any 小于或等于子查询结果中的某个值
  • = any  等于子查询结果中的某个值,相当于IN
  • != any 不等于子查询结果中的某个值

all

  • > all  大于子查询结果中的所有值
  • < all  小于子查询结果中的所有值
  • >= all 大于或等于子查询结果中的所有值
  • <= all 小于或等于子查询结果中的所有值
  • = all  等于子查询结果中所有值(除非子查询的结果全部相等,所以实际上没什么意义)
  • != all 不等于子查询结果中的任何一个值,相当于NOT IN


使用操作符进行查询

SELECT count(*) FROM customertag c WHERE c.tags @> ARRAY['近30天线下无消费']

注意,以上命令会查询失败,提示 operator does not exist: character varying[] @> text[]

原因是两边的类型不一致,解决办法是强制指定类型,如下

-- 指定数组里面内容的类型
SELECT count(*) FROM customertag c WHERE c.tags @> ARRAY['近30天线下无消费'::VARCHAR]

-- 指定数组的类型
SELECT count(*) FROM customertag c WHERE c.tags @> ARRAY['近30天线下无消费']::VARCHAR[]

操作符

操作符描述例子结果
=等于ARRAY[1,2,3] = ARRAY[1,2,3]TRUE
<>不等于ARRAY[1,2,3] <> ARRAY[1,2,4]TRUE
<小于ARRAY[1,2,3] < ARRAY[1,2,4]TRUE
>大于ARRAY[1,4,3] > ARRAY[1,2,4]TRUE
<=小于或等于ARRAY[1,2,3] <= ARRAY[1,2,3]TRUE
>=大于或等于ARRAY[1,4,3] >= ARRAY[1,4,3]TRUE
@>包含ARRAY[1,4,3] @> ARRAY[3,1]TRUE
<@被包含于ARRAY[2,7] <@ ARRAY[1,7,4,2,6]TRUE
&&重叠(有共同元素)ARRAY[1,4,3] && ARRAY[2,1]TRUE
||数组与数组连接ARRAY[1,2,3] || ARRAY[4,5,6]{1,2,3,4,5,6}

函数

函数说明语句结果
array_append向数组的末尾添加元素array_append(ARRAY[1,2], 3){1,2,3}
array_prepend向数组的开头添加函数array_prepend(1, ARRAY[2,3]){1,2,3}
array_cat连接两个数组array_cat(ARRAY[1,2,3], ARRAY[4,5]){1,2,3,4,5}
array_replace用新值替换每个等于给定值的数组元素array_replace(ARRAY[1,2,5,4], 5, 3){1,2,3,4}
array_remove删除某个给定值的数组元素array_remove(ARRAY[1,2,3,4],4){1,2,3}
[start:end]通过下标范围数组元素select (ARRAY[‘a’,‘b’,‘c’,‘d’])[1:2]{a,b}
array_position数组中指定元素出现的位置array_position(ARRAY[1,8,3,7], 8)2
array_dims返回数组维数的文本表示array_dims(ARRAY[[1,2,3], [4,5,6]])[1:2][1:3]
array_lower返回数组维数的下界array_lower(ARRAY[1,2,3,4], 1)1
array_upper返回数组维数的上界array_upper(ARRAY[1,2,3,4], 1)4
array_ndims返回数组的维数array_ndims(ARRAY[[1,2,3], [4,5,6]])2
array_length返回数组维度的长度array_length(array[1,2,3], 1)3
cardinality返回数组中的总元素数量,如果数组是空的则为0cardinality(ARRAY[1,2,3,5])4
array_to_string将数组转换为字符串,使用分隔符连接数组元素select array_to_string(ARRAY[1, 2, 3], ‘,’)1,2,3
string_to_array使用指定的分隔符把字符串分隔成数组元素select string_to_array(‘a,b,c’,‘,’){a,b,c}
array_agg把多个值合并到一个数组中SELECT id, array_agg(label) FROM t_label group by id{label1,label2}
unnest分解一个数组为一组行select unnest(ARRAY[1,2,3])1
2
3