在PostgreSQL数组中查找值的位置

min*_*hee 23 arrays postgresql position

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

Joe*_*ams 30

文档建议使用的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;
Run Code Online (Sandbox Code Playgroud)

这将返回第一个匹配的索引(如果存在).如果您想要所有比赛,只需更改RETURNS INTRETURNS SETOF INT.NULL如果找不到匹配项,则返回此函数.

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

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

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

(1 row)
Run Code Online (Sandbox Code Playgroud)

这是因为SQL认为NULL = NULL未知的(即NULL).参见函数比较.如果您希望array_search能够找到NULL元素,请进行更改

     WHERE $2[i] = $1
Run Code Online (Sandbox Code Playgroud)

     WHERE $2[i] IS NOT DISTINCT FROM $1
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案.当PostgreSQL 9.4添加`WITH ORDINAL`函数时,这将变得更简单,更高效,允许您只用`ORDINAL`编写`unnest(the_array).也许我应该为9.4编写并提交一个正确的`idx`函数,尽管...... (3认同)

OTA*_*TAR 17

从版本9.5开始,内置函数:array_position()array_positions()按行搜索数组键(仅第一次出现)或键(所有出现次数).

这些函数支持anyarray类型.


Cra*_*ger 6

对于整数数组,只能使用捆绑扩展中更快的idx函数intarray.

遗憾的是,这个函数尚未推广到支持所有数组类型,所以你对其他数组采用非常慢的SQL方法.