1

9.6データベースから返さ:コール集合を​​返すplpgsqlが機能私は、次のカスタムドメインとテーブル定義を持つクエリ私のPostgresでは

create domain lowResData as 
    float[21]; 

create table myRawValues (
    id text, 
    myData lowResData, 
    xAxis lowResData, 
    primary key(id)  
); 

次の関数は、私が欲しいの結果を生成することができます単一のアイテム。

reslt2

create or replace function allIdLowResData() returns setof float[] as 
$body$ 
declare r text; 
begin 
    for r in (select id from myRawValues where /*SOME CONDITION*/) 
    loop 
    return next myPlotter(getAxis(r), getData(r)); 
    end loop; 
    return; 
end 
$body$ 
language plpgsql; 
:私は特定のクエリを実行してから生産 すべて id年代のために同じことを行うと、このような結果に終わるしたい

create function getData(_id 'text') returns float[] as $$ 
select myData 
from myRawValues 
where id = _id 
$$ language sql; 

create function getAxis(_id 'text') returns float[] as $$ 
select xAxis 
from myRawValues 
where id = _id 
$$ language sql; 

create function myPlotter(myarray float[], myData float[]) 
returns table (frequency float, amplitude float) as 
$$ 
select * 
from unnest(myarray, myData) as u; 
$$ language sql; 

select * from myPlotter(getAxis('123'), getData('123')); 

result1

+1

今後の参考として、画像としてではなく*テキスト*としてデータを投稿してください。 –

答えて

1

LATERAL参加を使用して、あなたのセット - レットクエリの残りの部分と関数を返す。同様に:

CREATE OR REPLACE FUNCTION allIdLowResData() 
    RETURNS TABLE (frequency float, amplitude float, id text) AS 
$func$ 
SELECT p.*, r.id 
FROM myRawValues r 
LEFT JOIN LATERAL myPlotter(r.xAxis, r.myData) p ON true 
WHERE /*SOME CONDITION*/ 
$func$ LANGUAGE sql; 

を参照してください:

プラス、機能(RETURNS)の宣言された戻り値の型は、実際に返されたものと一致しなければなりません。

ここでは、より単純なSQL関数を使用しています。この場合、PL/pgSQLでリードする場合はRETURNS QUERYと同じことができます。

あなたはPostgresの配列定義について、これらの詳細に興味があるかもしれません、quoted from the manual:

しかし、現在の実装では、任意の供給配列サイズ 制限を無視し、すなわち、動作が指定 長さの配列と同じです。

現在の実装では、 ディメンションのいずれかの宣言番号が強制されません。特定の要素タイプの配列は、 次元のサイズまたは数にかかわらず、すべて同じタイプであるとみなされる です。したがって、配列のサイズまたは次元の数を CREATE TABLEに宣言するだけです。実行時の動作には影響しません。

意味、あなたのdomainは、現在のところ(合併症を除いて)何の効果もないノイズです。テーブル内の正確に21の要素を持つ1次元配列を実際に適用するには、CHECKという制約を使用します。以下のような:彼らによりがない限り

CREATE DOMAIN lowResData AS float[21] -- "[21]" is just for documentation 
CONSTRAINT dim1_elem21 CHECK (array_ndims(VALUE) = 1 AND array_length(VALUE, 1) = 21); 

私も機能getData()getAxis()を捨てるでしょう。

関連する問題