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

テーブルをパラメータとして渡す

    @dezsoが述べたように、この場合は動的SQLが必要になります。

    EXECUTEを使用した動的SQL

    ですから、あなたは正しい方向に進んでいます。 PL / pgSQLを使用して動的SQLステートメントを作成しますが、最後の仕上げが必要です。

    CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, _table text) 
    RETURNS integer AS $$
    BEGIN
    RETURN QUERY EXECUTE format('SELECT id FROM %I AS vertices 
      ORDER BY vertices.geom <->ST_SetSrid(ST_MakePoint(long,lat),4326) LIMIT 1;',_table);
    END
    $$ LANGUAGE plpgsql;
    

    これで問題が解決すると思います。

    注:上記のソリューションでSETOFを使用するとエラーが見つかりました 、以下の問題を修正しようとしました。

    編集:

    ここでいくつかの編集を行います。うまくいけば、1つの解決策で問題が解決します。また、以前および現在のソリューションの構文エラーをお許しください。今はテストする時間がありません。 :(

    1) SETOFを返してみてください。 整数、もちろんあなたは1つだけを返すことを知っています。この場合の戻りタイプは、整数を含む単一の1列の行になります。

    CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, _table text) 
    RETURNS SETOF integer AS $$
    BEGIN
    RETURN QUERY EXECUTE format('SELECT id FROM %I AS vertices 
      ORDER BY vertices.geom <->ST_SetSrid(ST_MakePoint(long,lat),4326) LIMIT 1;',_table);
    END
    $$ LANGUAGE plpgsql;
    

    次に、次のように呼び出します:

    SELECT * FROM convert_from_lon_lat(...);
    

    2) 具体的に整数を返すには、これを試すことができると思います:

    CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, _table text) 
    RETURNS integer AS $$
    
    DECLARE
    return_id integer;
    
    BEGIN
    EXECUTE format('SELECT id FROM %I AS vertices 
      ORDER BY vertices.geom <->ST_SetSrid(ST_MakePoint(long,lat),4326) LIMIT 1;',_table)
      INTO return_id;
    
    RETURN return_id;
    END
    $$ LANGUAGE plpgsql;
    



    1. mysqlにリモート接続します

    2. SQLServerのテキスト型とvarcharデータ型

    3. [MySQL]:照合方法とは何ですか?

    4. MySQLでのMyISAMの操作