2016-06-02 5 views
0

次の例では、「{」と「}」を「[」と「]」に変更します。私は2つのcoloumnsを持つテーブルAを持っています.1つはstring型のtext_1で、もう1つはbigint型のcountです。私がしようとしているのは、[[1,2,4],[2,4,5],...]のような行列表記を返すことです。 array_agg_multを更新する方法のほかにpostgresの配列集約のためのブラケットの変更

CREATE AGGREGATE array_agg_mult(anyarray) (
    SFUNC = array_cat, 
    STYPE = anyarray, 
    INITCOND = '{}' 
); 

WITH B AS(
SELECT 
    array_agg(count) AS count 
FROM 
    A 
GROUP BY 
    text_1 
) 
SELECT 
    array_agg_mult(ARRAY[count]) 
FROM 
    B; 

、私はINITCOND = '[]'INITCOND = '{}'を変更しようとする場合、私は

ERROR: function "array_agg_mult" already exists with same argument types

はたぶんpostgresのでJSON世代を使用して、スマートなソリューションがあり得ます。

答えて

2

これらの角括弧は、集計とは関係ありません。これらは、配列型の出力形式です。新しい集約関数はそれを変更しません。

は、あなたは、単に表示されます

select array[1,2,3] 

を実行していることを確認することができます

array 
------- 
{1,2,3} 

INITCOND'{}'は、単に "空の配列" を意味します。

詳細についてはマニュアルを参照してください、その表示を変更するhttps://www.postgresql.org/docs/current/static/arrays.html#ARRAYS-IO

唯一の方法は、一般にアレイの出力方法を変更することであろう。私はあなたが別の形式で表示に配列をしたい場合は、それを行うために、独自の関数を記述

これはPostgresのソースをハッキングなしで行うことができるとは思わない(そしておそらく多くのものを壊すことになります)。

create function format_array(p_array anyarray) 
    returns text 
as 
$$ 
    select translate(p_array::text, '{}', '[]'); 
$$ 
language sql; 

その後は、任意の配列にそれを使用することができます

select format_array(array[1,2,3]), 
     format_array('{}'::int[]), 
     format_array(array[[1,2,3],[4,5,6]]); 

意志出力:もちろん

format_array | format_array | format_array  
-------------+--------------+------------------ 
[1,2,3]  | []   | [[1,2,3],[4,5,6]] 

あなたはformat_array()機能でより多くの "化粧品" を適用することができますが、その後、ちょうど{}を交換しますwith []


あなたのクエリはその後になる:事前答えを

WITH B AS 
(
    SELECT array_agg(count) AS count 
    FROM A 
    GROUP BY text_1 
) 
SELECT format_array(array_agg_mult(ARRAY[count])) 
FROM B; 
+0

感謝。あなたが言ったように、角括弧は配列を表示するためのものです。 "{"と "}"の代わりに "["と "]"を使用する結果を作成する方法。他の関数を使用してformat_array関数を作成しないようにすることはできますか? 'array_to_json'は大括弧で囲まれた文字列も返します。 – StellaMaris

+0

@StellaMaris:出力をフォーマットするには常に_some_関数が必要です。あなたが望むすべてのものをフォーマットする独自の関数を作成するのに間違っていますか? –

+0

何も問題はありません、私はただ望む出力を持つ既存の関数を求めています。あなたの関数に戻って、私は実際に関数ヘッダの 'p_array anyarray'パラメータを理解していません。 p_arrayはanyarrayの型ですか?私はそれについてのドキュメントを見つけることができませんでした。 – StellaMaris

関連する問題