在PostgreSQL数组中查找值的位置

时间:2012-01-10 03:00:43

标签: arrays postgresql position

如何在PostgreSQL数组中获取值的位置? Python有.index()方法,PHP有array_search()函数,但我找不到PostgreSQL的任何这样的函数。我应该写一个存储函数来做到这一点吗?我更喜欢使用内置函数来解决。

3 个答案:

答案 0 :(得分:29)

documentation recommends使用generate_subscripts功能。下面的函数模拟PHP的array_search

CREATE FUNCTION array_search(needle ANYELEMENT, haystack ANYARRAY)
RETURNS INT AS $$
    SELECT i
      FROM generate_subscripts($2, 1) AS i
     WHERE $2[i] = $1
  ORDER BY i
$$ LANGUAGE sql STABLE;

这将返回第一个匹配的索引(如果存在)。如果您想要所有匹配项,只需将RETURNS INT更改为RETURNS SETOF INT即可。如果没有找到匹配项,则此函数返回NULL

此功能仅适用于一维数组。

另外,请记住array_search(NULL, a)始终返回NULL,即使数组包含null元素:

> SELECT array_search(null, array[1, 2, null, 4]);
 array_search 
--------------

(1 row)

这是因为SQL认为NULL = NULL unknown (即NULL)。见functions-comparison。如果您希望array_search能够找到NULL元素,请更改

     WHERE $2[i] = $1

     WHERE $2[i] IS NOT DISTINCT FROM $1

答案 1 :(得分:13)

Since version 9.5,内置函数:array_position()array_positions(),用于按值搜索数组键(仅首次出现)或键(所有出现次数)。

这些函数支持anyarray类型。

答案 2 :(得分:5)

对于整数数组,您可以使用更快的idx function from the intarray bundled extension

不幸的是,这个函数尚未推广到支持所有数组类型,所以你对其他数组的SQL方法很慢。