14

我有以下 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)}

有任何想法吗?

4

2 回答 2

16
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 
于 2012-09-19T15:35:56.713 回答
5

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

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

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 语法重写了查询,这通常是可取的,并使用表别名来简化。

于 2012-09-19T17:32:46.447 回答