2012-09-19 5 views
6

Tengo la siguiente consulta Postgres:límite del sistema para ARRAY_AGG()

SELECT array_agg("Esns".id) 
FROM public."Esns", 
    public."PurchaseOrderItems" 
WHERE 
    "Esns"."PurchaseOrderItemId" = "PurchaseOrderItems".id 
    AND "PurchaseOrderItems"."GradeId"=2 
LIMIT 2; 

El límite afectará a las filas. Quiero que limite el array_agg() a 2 elementos. La siguiente consulta funciona pero me da mi salida con cada entrada entre comillas:

SELECT array_agg ("temp") 
FROM (
    SELECT "Esns".id 
    FROM public."Esns", 
     public."PurchaseOrderItems" 
    WHERE 
     "Esns"."PurchaseOrderItemId" = "PurchaseOrderItems".id 
     AND "PurchaseOrderItems"."GradeId"=2 
    LIMIT 4 
) as "temp" ; 

Esto me da el siguiente resultado

{(13),(14),(15),(12)} 

¿Alguna idea?

Respuesta

6
select id[1], id[2] 
from (
    SELECT array_agg("Esns".id) as id 
    FROM public."Esns", 
     public."PurchaseOrderItems" 
    WHERE 
     "Esns"."PurchaseOrderItemId" = "PurchaseOrderItems".id 
     AND "PurchaseOrderItems"."GradeId"=2 
) s 

o si desea que la salida como un array:

SELECT (array_agg("Esns".id))[1:2] as id_array 
FROM public."Esns", 
    public."PurchaseOrderItems" 
WHERE 
    "Esns"."PurchaseOrderItemId" = "PurchaseOrderItems".id 
    AND "PurchaseOrderItems"."GradeId"=2 
+0

Perfecto. Gracias. La segunda respuesta es lo que estaba buscando, ya que quiero una matriz y quiero ser capaz de establecer dinámicamente la cota superior en el límite. Gracias. – user1175817

+0

Bueno. ¡El segundo ejemplo es perfecto! –

2

Las citas en el resultado son decoradores para el tipo fila. No está creando una matriz de filas enteras (que por casualidad contienen una sola columna). Use la columna en su lugar.

Además, directa array construction de un resultado de la consulta es normalmente más sencillo y rápido:

SELECT ARRAY (
    SELECT e.id 
    FROM public."Esns" e 
    JOIN public."PurchaseOrderItems" p ON p.id = e."PurchaseOrderItemId" 
    WHERE p."GradeId" = 2 
    -- ORDER BY ??? 
    LIMIT 4 -- or 2? 
    ) 

Es necesario ORDER BY algo si quieres un resultado estable y/o recoger ciertas filas. De lo contrario, el resultado es arbitrario y puede cambiar en cualquier momento.

Mientras escribo esto reescribí la consulta con la sintaxis JOIN explícita, que generalmente es preferible, y utilicé alias para simplificar.

Cuestiones relacionadas