限量ARRAY_AGG()(Set limit to array_agg())

2019-07-31 17:36发布

我有以下Postgres的查询:

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

该限制会影响行。 我想它的限制array_agg()以2项。 下面的查询工作,但我得到我在引号中的每个条目的输出:

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" ;

这给我下面的输出

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

有任何想法吗?

Answer 1:

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

或者如果你想在输出数组:

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


Answer 2:

在结果中,引号是该行式装饰。 您还没有建立完整行(其中会包含一列)的阵列。 使用来代替。

此外,直接的阵列结构从查询结果通常是简单,更快捷:

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?
   )

你需要ORDER BY的东西,如果你想有一个稳定的结果和/或选择某些行。 否则,结果是任意的,并且可以随时更改。

而处于它我重写查询与显式JOIN语法,这是通常优选,并用于别名来简化。



文章来源: Set limit to array_agg()