2017-07-13 6 views
0

2都市間の距離を計算したいと思います。私は次の機能を持っています:選択クエリからどのように値を返すことができますか?

CREATE OR REPLACE FUNCTION calc_distance_for_cities(fromCityId bigint, toCityId bigint) RETURNS integer LANGUAGE plpgsql as $$ 

    DECLARE 
      fromCityCoords Geometry; 
      toCityCoords Geometry; 

    BEGIN 
      SELECT * FROM geo_cities WHERE geo_cities.id = fromCityId RETURNING coords INTO fromCityCoords; 
      SELECT * FROM geo_cities WHERE geo_cities.id = toCityId RETURNING coords INTO toCityCoords; 
      SELECT ST_Distance(fromCityCoords, toCityCoords, true) 
    END; 

    $$ 

私は間違っていますか?

答えて

0

TL; DRあなたは二つのことを "間違ってやっていた":returns integerreturns floatでなければならず、最後select ..return ..でなければなりません。

詳細:

RETURN PL/pgSQL関数から値を返します - あなたはそれの代わりに、最後のSELECTを使用する必要があります。 st_distance(..)floatの値がhttp://postgis.refractions.net/docs/ST_Distance.htmlになるため、最初の行にreturns floatが必要です。

これを試してみてください:

CREATE OR REPLACE FUNCTION calc_distance_for_cities(fromCityId bigint, toCityId bigint) RETURNS float LANGUAGE plpgsql as $$ 

    DECLARE 
      fromCityCoords Geometry; 
      toCityCoords Geometry; 

    BEGIN 
      SELECT coords INTO fromCityCoords FROM geo_cities WHERE geo_cities.id = fromCityId; 
      SELECT coords INTO toCityCoords FROM geo_cities WHERE geo_cities.id = toCityId; 
      RETURN ST_Distance(fromCityCoords, toCityCoords, true); 
    END; 

    $$; 

また、この関数は実際にPL/pgSQL言語を必要とせず、簡単にCTE(https://www.postgresql.org/docs/current/static/queries-with.html)で、プレーンなSQLで実装することができます。

create or replace function calc_distance_for_cities(int8, int8) returns float as $$ 
    with _from(city_coords) as (
    select coords from geo_cities where geo_cities.id = $1 
), _to(city_coords) as (
    select coords from geo_cities where geo_cities.id = $2 
) 
    select st_distance(_from.city_coords, _to.city_coords) 
    from _from, _to; 
$$ language sql; 

かさらに無制限CTE:

create or replace function calc_distance_for_cities(int8, int8) returns float as $$ 
    select st_distance(
    (select coords from geo_cities where geo_cities.id = $1), 
    (select coords from geo_cities where geo_cities.id = $2) 
); 
$$ language sql; 
関連する問題