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

¿Cómo acceder al índice interno de la matriz con postgreSQL?

PostgreSQL lo hace proporcionar funciones dedicadas para generar subíndices de matriz:

WITH   x(a) AS ( VALUES ('{1,20,3,5}'::int[]) )
SELECT generate_subscripts(a, 1) AS idx
      ,unnest(a) AS val
FROM   x;

Efectivamente, hace casi lo mismo que la consulta de @Frank, solo que sin la subconsulta.
Además, funciona con subíndices que no comienzan con 1 .

Cualquiera de las dos soluciones funciona para unidimensional matrices solamente! (Se puede expandir fácilmente a múltiples dimensiones).

Función:

CREATE OR REPLACE FUNCTION unnest_with_idx(anyarray) 
RETURNS TABLE(idx integer, val anyelement) LANGUAGE SQL IMMUTABLE AS
$func$
  SELECT generate_subscripts($1, 1), unnest($1);
$func$;

Llamar:

SELECT * FROM unnest_with_idx('{1,20,3,5}'::int[]);

Considere también:

SELECT * FROM unnest_with_idx('[4:7]={1,20,3,5}'::int[]);

Más información sobre subíndices de matrices en esta pregunta relacionada.

Si en realidad quieres subíndices normalizados (comenzando con 1), yo usaría:

SELECT generate_series(1, array_length($1,1)) ...

Esa es casi la consulta que ya tenía, solo con array_length() en lugar de array_upper() - que fallaría con subíndices no estándar.

Rendimiento

Realicé una prueba rápida en una matriz de 1000 int con todas las consultas presentadas aquí hasta el momento. Todos funcionan casi igual (~ 3,5 ms), excepto row_number() en una subconsulta (~ 7,5 ms) - como se esperaba, debido a la subconsulta.

Actualización:Postgres 9.4+

A menos que opere con subíndices de índice no estándar, use el nuevo WITH ORDINALITY en cambio:

  • PostgreSQL unnest() con número de elemento