sql >> Base de Datos >  >> RDS >> PostgreSQL

Encontrar la posición de un valor en arreglos de PostgreSQL

La documentación recomienda usando generate_subscripts función. La siguiente función emula array_search de PHP :

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 de la primera coincidencia, si está presente. Si desea todas las coincidencias, simplemente cambie RETURNS INT a RETURNS SETOF INT . Esta función, tal como está, devuelve NULL si no se encuentra ninguna coincidencia.

Esta función solo funciona con arreglos unidimensionales.

Además, tenga 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 que SQL considera NULL = NULL ser desconocido (es decir, NULL ). Consulte comparación de funciones . Si quieres array_search para poder encontrar NULL elementos, cambio

     WHERE $2[i] = $1

a

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