14

私は次のPostgresクエリを持っています:

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

制限は行に影響します。2点に限定したいですarray_agg()。次のクエリは機能しますが、各エントリを引用符で囲んで出力を取得します。

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

結果の括弧(「引用符」ではない)は、リテラルのデコレーターです。行全体の配列を作成しています(たまたま1つの列しか含まれていません)。代わりに、のみを集計します。

また、クエリ結果からの直接配列の構築は、通常、より簡単で高速です。

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 に答える