postgresql数组重叠(有共同元素)查询

直接上最终代码:

select distinct id from a where  string_to_array(in_area,',') && (select ARRAY_AGG( code) from areas where code like '11%' or code = '100000')::TEXT[]

pg语法:

表 9.48显示了可用于数组类型的运算符。

表 9.48。数组运算符

操作员 描述 例子 结果
= 平等的 ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3] t
<> 不等于 ARRAY[1,2,3] <> ARRAY[1,2,4] t
< 少于 ARRAY[1,2,3] < ARRAY[1,2,4] t
> 比...更棒 ARRAY[1,4,3] > ARRAY[1,2,4] t
<= 小于或等于 ARRAY[1,2,3] <= ARRAY[1,2,3] t
>= 大于或等于 ARRAY[1,4,3] >= ARRAY[1,4,3] t
@> 包含 ARRAY[1,4,3] @> ARRAY[3,1,3] t
<@ 包含于 ARRAY[2,2,7] <@ ARRAY[1,7,4,2,6] t
&& 重叠(有共同元素) ARRAY[1,4,3] && ARRAY[2,1] t
|| 数组到数组的串联 ARRAY[1,2,3] || ARRAY[4,5,6] {1,2,3,4,5,6}
|| 数组到数组的串联 ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]] {{1,2,3},{4,5,6},{7,8,9}}
|| 元素到数组的串联 3 || ARRAY[4,5,6] {3,4,5,6}
|| 数组到元素的串联 ARRAY[4,5,6] || 7 {4,5,6,7}

数组排序运算符(<>=等)使用元素数据类型的默认 B 树比较函数逐个元素比较数组内容,并根据第一个差异进行排序。在多维数组中,元素按行主顺序访问(最后一个下标变化最快)。如果两个数组的内容相等但维数不同,则维数信息中的第一个差异决定排序顺序。(这是 8.2 之前的PostgreSQL版本的一个变化:旧版本会声称两个具有相同内容的数组相等,即使维数或下标范围不同。)

如果一个数组的每个元素都出现在另一个数组中,则数组包含运算符 (<@@>) 会认为一个数组包含在另一个数组中。重复项不会被特殊处理,因此ARRAY[1]ARRAY[1,1]被认为包含另一个。

有关数组运算符行为的更多详细信息,请参阅第 8.15 节。有关哪些运算符支持索引操作的更多详细信息,请参阅第 11.2 节。

表 9.49显示了可用于数组类型的函数。有关使用这些函数的更多信息和示例,请参阅第 8.15 节。

表 9.49。数组函数

功能 返回类型 描述 例子 结果
array_append(anyarrayanyelement) anyarray 将一个元素追加到数组末尾 array_append(ARRAY[1,2], 3) {1,2,3}
array_cat(anyarrayanyarray) anyarray 连接两个数组 array_cat(ARRAY[1,2,3], ARRAY[4,5]) {1,2,3,4,5}
array_ndims(anyarray) int 返回数组的维数 array_ndims(ARRAY[[1,2,3], [4,5,6]]) 2
array_dims(anyarray) text 返回数组维度的文本表示 array_dims(ARRAY[[1,2,3], [4,5,6]]) [1:2][1:3]
array_fill(anyelementint[] [, int[]]) anyarray 返回一个使用提供的值和维度进行初始化的数组,可以选择使用除 1 之外的下限 array_fill(7, ARRAY[3], ARRAY[2]) [2:4]={7,7,7}
array_length(anyarrayint) int 返回请求的数组维度的长度 array_length(array[1,2,3], 1) 3
array_lower(anyarrayint) int 返回所请求数组维度的下限 array_lower('[0:2]={1,2,3}'::int[], 1) 0
array_position(anyarrayanyelement [, int]) int 返回数组中第二个参数第一次出现的下标,从第三个参数指示的元素或第一个元素开始(数组必须是一维的) array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon') 2
array_positions(anyarrayanyelement) int[] 返回作为第一个参数给出的数组中第二个参数的所有出现的下标数组(数组必须是一维的) array_positions(ARRAY['A','A','B','A'], 'A') {1,2,4}
array_prepend(anyelementanyarray) anyarray 将一个元素追加到数组的开头 array_prepend(1, ARRAY[2,3]) {1,2,3}
array_remove(anyarrayanyelement) anyarray 从数组中删除所有等于给定值的元素(数组必须是一维的) array_remove(ARRAY[1,2,3,2], 2) {1,3}
array_replace(anyarrayanyelementanyelement) anyarray 用新值替换等于给定值的每个数组元素 array_replace(ARRAY[1,2,5,4], 5, 3) {1,2,3,4}
array_to_string(anyarraytext [, text]) text 使用提供的分隔符和可选的空字符串连接数组元素 array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*') 1,2,3,*,5
array_upper(anyarrayint) int 返回所请求数组维度的上限 array_upper(ARRAY[1,8,3,7], 1) 4
cardinality(anyarray) int 返回数组中元素的总数,如果数组为空则返回 0 cardinality(ARRAY[[1,2],[3,4]]) 4
string_to_array(texttext [, text]) text[] 使用提供的分隔符和可选的空字符串将字符串拆分为数组元素 string_to_array('xx~^~yy~^~zz', '~^~', 'yy') {xx,NULL,zz}
unnest(anyarray) setof anyelement 将数组扩展为一组行 unnest(ARRAY[1,2])
1
2
(2 行)
unnest(anyarrayanyarray [, ...]) setof anyelement, anyelement [, ...] 将多个数组(可能是不同类型的)扩展为一组行。仅在 FROM 子句中允许这样做;参见第 7.2.1.4 节 unnest(ARRAY[1,2],ARRAY['foo','bar','baz'])
1 富
2巴
空巴兹
(3行)

array_position和中array_positions,使用语义将每个数组元素与搜索值进行比较IS NOT DISTINCT FROM

在 中array_positionNULL如果未找到该值,则返回。

In array_positions,NULL仅当数组为NULL;时才返回 如果在数组中找不到该值,则返回空数组。

在 中string_to_array,如果 delimiter 参数为 NULL,则输入字符串中的每个字符将成为结果数组中的单独元素。如果分隔符为空字符串,则整个输入字符串将作为单元素数组返回。否则,输入字符串会在每次出现分隔符字符串时被分割。

在 中string_to_array,如果省略空字符串参数或为 NULL,则输入的任何子字符串都不会被 NULL 替换。在 中array_to_string,如果空字符串参数被省略或为 NULL,则将简单地跳过数组中的任何空元素,并且不会在输出字符串中表示。

参考官方文档:https://www.postgresql.org/docs/10/functions-array.html

其他问题:

异常:

Postgresql:nested exception:operator does not exist: text[] @> character varying[]
原文异常情况链接:https://blog.csdn.net/GodSure0914/article/details/116123770

处理方法:

强转::TEXT[] 类型。

你可能感兴趣的:(postgresql,数据库)