Postgres 9.4でテストされたすべて 。
Postgresには、ROW型を処理するための構文にいくつかの弱点があります。テーブル(エイリアス)から直接キャストすることはできません:
SELECT w::waypoint FROM waypoints w;
解決策はわずか1ステップです。サブクエリで行を分解すると、キャストが機能します。このように、列の値は、text
にキャストすることなく、分解されて新しいタイプに直接ラップされます。 帰ってきた。すべての列を個別にリストする必要はなく、カスタムキャストを作成する必要もありません。
SELECT (w.*)::waypoint FROM (SELECT * FROM waypoints) w;
またはそれより短い:
SELECT w.*::waypoint FROM (TABLE waypoints) w;
またはそれより短いですが:
SELECT w::waypoint FROM (TABLE waypoints) w;
30k行と単純なタイプを使用したクイックテストで10倍高速で、これはより短く、より高速です。 text
にキャストするよりも 帰ってきた。 (大きい)jsonb
がある場合 列または任意の複合型(text
との間の高価な変換 )、違いはまだはるかに大きくなります。
さらに重要なのは、必要がないことです。 別のカスタムコンポジット(ROW)タイプ。すべてのテーブルには、すでにその行がタイプとして自動的に定義されています。既存のタイプのwaypoints
を使用するだけです waypoint
の代わりに (可能であれば)。次に必要なのは:
SELECT w FROM waypoints w;
または、例:
SELECT everything(t) FROM temp t; -- using type waypoints
SELECT everything(t::waypoint) FROM (TABLE temp) t; -- using type waypoint
傍白:
- テーブルには「引数」ではなく列があります。
-
あなたはではありません
table parameter to this function
、むしろ行の値 。これが、テーブルを名前で渡す方法です。Postgresで直接パラメータとして「テーブル全体を渡す」ことはできません。テーブル変数はありません。そのためには、カーソルまたは一時テーブルを使用します。
機能
関数に無効な型宣言があり、不必要に複雑です。ビューを作成したいとは思いません:
CREATE FUNCTION everything(_wp waypoint) -- or use type waypoints
RETURNS TABLE(node int, xy text[]) AS
$func$
BEGIN
RETURN QUERY
SELECT ...
END
$func$ LANGUAGE plpgsql;
text array
text[]
を使用した有効な構文ではありません 代わりに、text
の配列を宣言します 。
テーブル/タイプ名waypoints
は使用しないでください 関数パラメータ名として、混乱を招くエラーが発生する可能性があります。
または、ケースが示されているほど単純な場合は、単純なSQL関数を使用します。
CREATE FUNCTION everything(_wp waypoint) -- or use type waypoints
RETURNS TABLE(node int, xy text[]) AS
$func$
SELECT ...
$func$ LANGUAGE sql;
言語名を引用しないでください。識別子です。