PostgreSQL教程 -》数据类型 -》在数组中搜索
最新学讯:近期OCP认证正在报名中,因考试人员较多请尽快报名获取最近考试时间,报名费用请联系在线老师,甲骨文官方认证,报名从速!
我要咨询8.15.5. 在数组中搜索
要在一个数组中搜索一个值,每一个值都必须被检查。这可以手动完成,但是我们必须知道数组的尺寸。例如:
SELECT * FROM sal_emp WHERE pay_by_quarter[1] = 10000 OR
pay_by_quarter[2] = 10000 OR
pay_by_quarter[3] = 10000 OR
pay_by_quarter[4] = 10000;
但是这对于大型数组来说太过冗长,且在数组尺寸未知时无法使用。一种可选的方法可见第 9.23 节。上面的查询可以被替换为:
SELECT * FROM sal_emp WHERE 10000 = ANY (pay_by_quarter);
此外,我们还可以查找所有元素值都为10000的数组所在的行:
SELECT * FROM sal_emp WHERE 10000 = ALL (pay_by_quarter);
另外,generate_subscripts函数也可以用来完成类似的查找。例如:
SELECT * FROM
(SELECT pay_by_quarter,
generate_subscripts(pay_by_quarter, 1) AS s
FROM sal_emp) AS foo
WHERE pay_by_quarter[s] = 10000;
该函数的描述见表 9.62。
我们也可以使用&&操作符来搜索一个数组,它会检查左操作数是否与右操作数重叠。例如:
SELECT * FROM sal_emp WHERE pay_by_quarter && ARRAY[10000];
该操作符和其他数组操作符的进一步描述请见第 9.18 节。如第 11.2 节所述,它可以使用一个合适的索引来提速。
你也可以使用array_position和array_positions在一个 数组中搜索特定值。前者返回值在数组中第一次出现的位置的下标。后者返回一个数组, 其中有该值在数组中的所有出现位置的下标。例如:
SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon');
array_positions
-----------------
2
SELECT array_positions(ARRAY[1, 4, 3, 1, 3, 4, 2, 1], 1);
array_positions
-----------------
{1,4,8}
提示
数组不是集合,在其中搜索指定数组元素可能是数据设计失误的表现。考虑使用一个独立的表来替代,其中每一行都对应于一个数组元素。这将更有利于搜索,并且对于大量元素的可扩展性更好。