2
WITH Dept(DName, HeadCount) AS (
   VALUES ('D1', 5), ('D2', 6), ('D3', 7)
) 

Select array_agg(DName), array_agg(HeadCount) from Dept

上記のクエリは生成されます。

"{D1,D2,D3}";"{5,6,7}"

クエリで列名を指定せずに、つまり一般的な方法で同じ出力を生成する方法はありますか。

次のクエリの magic_function の代わりに組み込み関数はありますか?

 Select magic_function(*) from Dept

または、information_schema.columnsと結合するなど、フィールド名を動的に抽出する方法はありますか。

4

1 に答える 1

1

私が知っている魔法の関数はありません。つまり、標準の Postgres にはおそらくそのようなものはありません。

情報スキーマまたはカタログ テーブルは、この例のアドホックな行タイプでは役に立ちません。しかし、おそらく、登録された行タイプを使用し、このルートを提供するtableでこれを行うことを検討しているでしょう:

WITH x AS (SELECT 'mytable'::regclass AS tbl)
SELECT 'SELECT '
     || string_agg(format('array_agg(%I) AS %1$I_arr', a.attname), E'\n ,')
     || E'\nFROM ' || tbl
FROM   x
JOIN   pg_attribute a ON a.attrelid = x.tbl
WHERE  NOT a.attisdropped  -- no dropped (dead) columns
AND    a.attnum > 0        -- no system columns (you may or may not want this)
GROUP  BY x.tbl

これにより、適切な SQL ステートメントが動的に生成されます。
テーブル名を to にキャストregclassすると、SQL インジェクションに対して安全になります。この関連する回答の詳細な説明:
PostgreSQL 関数パラメーターとしてのテーブル名

結果:

SELECT array_agg(col1) AS col1_arr
 ,array_agg("illegal nAmE") AS "illegal nAmE_arr"
 , ...
FROM mytable

戻り値の型も動的であるため、関数内で動的 SQL を使用して完全に自動化することは容易ではありません。カーソルを作成して返すこともできますが、それはおそらくやり過ぎです

于 2013-06-13T13:57:35.523 に答える