2012-01-10 18 views

Respuesta

9

Since version 9.5, hay funciones integradas: array_position() y array_positions(), para buscar la clave de matriz (solo la primera aparición) o las claves (todas las apariciones), por valor.

Estas funciones son compatibles con el tipo anyarray.

27

El documentation recommends utilizando la función generate_subscripts. La función de emular a continuación PHP de 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; 

Esto devuelve el índice del primer partido, si está presente. Si desea todas las coincidencias, simplemente cambie RETURNS INT a RETURNS SETOF INT. Esta función, como está, devuelve NULL si no se encuentra ninguna coincidencia.

Esta función solo funciona con matrices unidimensionales.

Además, tener en cuenta que array_search(NULL, a) siempre devuelve NULL, incluso si la matriz contiene elementos nulos:

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

(1 row) 

Esto se debe a SQL considera NULL = NULL ser desconocido (es decir NULL). Ver functions-comparison. Si quieres array_search a ser capaz de encontrar NULL elementos, cambiar

 WHERE $2[i] = $1 

a

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

+1 para generate_subscripts() y una respuesta muy completa. –

+2

Buena respuesta. Esto se volverá más simple y más eficiente cuando PostgreSQL 9.4 agregue funciones 'WITH ORDINAL', lo que le permite escribir' unnest (the_array) WITH ORDINAL'. Quizás debería escribir y enviar una función apropiada de 'idx' para 9.4, aunque ... –

4

Para matrices de enteros solamente se puede utilizar en gran medida el más rápido idx function from the intarray bundled extension.

Esta función no se ha generalizado para admitir todos los tipos de matriz, lamentablemente, por lo que está atascado con un enfoque SQL muy lento para otras matrices.

Cuestiones relacionadas