PostgreSql
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 | 返回数组中的总元素数量,如果数组是空的则为0 | cardinality(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 |