sql >> データベース >  >> RDS >> PostgreSQL

この関数にテーブルパラメータを渡すにはどうすればよいですか?

    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;
    

    SQLフィドル

    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;
    

    言語名を引用しないでください。識別子です。



    1. mysqlクエリで重複を削除する方法

    2. 複数のブラウザの永続的なログインを許可する場合のデータベースの問題

    3. 現在の構成に従ってマップされたDoctrineORMエンティティはありません

    4. CMS用のカスタムhtmlタグを作成しますか?