将限制设置为array_agg()

use*_*817 11 sql arrays postgresql limit

我有以下Postgres查询:

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

限制将影响行.我希望它限制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" ;
Run Code Online (Sandbox Code Playgroud)

这给了我以下输出

{(13),(14),(15),(12)}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Clo*_*eto 11

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
Run Code Online (Sandbox Code Playgroud)

或者如果您希望输出为数组:

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


Erw*_*ter 5

结果中的括号(不是“引号”)是行文字的装饰器。您正在构建一个整行数组(恰好只包含一列)。相反,仅聚合

此外,从查询结果直接构建数组通常更简单、更快:

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?
   )
Run Code Online (Sandbox Code Playgroud)

ORDER BY如果您想要稳定的结果和/或选择某些行,您需要做一些事情。否则,结果是任意的,并且可能会随着下一次调用而改变。

在执行此操作时,我使用显式 JOIN 语法重写了查询(这通常是更可取的),并使用表别名来简化。