2012-01-10 21 views

回答

9

Since version 9.5,內置函數:array_position()array_positions(),用於按值查找數組鍵(僅第一次出現)或鍵(所有出現)。

這些函數支持anyarray類型。

27

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未知(即NULL)。見functions-comparison。如果你想array_search能夠找到NULL元素,改變

 WHERE $2[i] = $1 

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

+1 for generate_subscripts()和一個非常完整的答案。 – 2012-01-11 00:18:56

+2

很好的答案。當PostgreSQL 9.4添加'WITH ORDINAL'函數時,這將變得更簡單和更高效,從而允許您只寫'unnest(the_array)WITH ORDINAL'。也許我應該爲9.4寫一個適當的'idx'函數,儘管... – 2013-07-26 02:59:11