【问题标题】:How to create function postgresql join table in Hasura如何在 Hasura 中创建函数 postgresql 连接表
【发布时间】:2021-02-24 17:29:26
【问题描述】:

我想创建一个函数来计算用户和 geolayer 之间的距离和排序。我执行以下操作:

CREATE OR REPLACE FUNCTION search_geolayer_near_user(location text) 
RETURNS TABLE(id int, layer_name text, gps_to_center_layer numeric, gps_belong_province boolean) AS $func$
    SELECT gl.id, gl.layer_name, ST_Distance(
            ST_AsText(ST_Centroid(ST_GeometryFromText(ST_AsText(ST_MakeEnvelope(gl.minx, gl.miny, gl.maxx, gl.maxy, 4326))))),
            location
        ) AS gps_to_center_layer,
        ST_AsText(ST_Centroid(ST_GeometryFromText(ST_AsText(ST_MakeEnvelope(r.minx, r.miny, r.maxx, r.maxy, 4326))))),
    ST_contains(
    ST_GeometryFromText(ST_AsText(ST_MakeEnvelope(r.minx, r.miny, r.maxx, r.maxy, 4326))),
    ST_GeometryFromText(location)) 
     AS gps_belong_province
    --   
    FROM "GeoLayers" gl JOIN "Regions" r ON gl.province_id = r.id
    WHERE gl.deleted_flg = false 
    GROUP BY gl.id , gl.layer_name, r.minx, r.miny, r.maxx, r.maxy, gl.minx, gl.miny, gl.maxx, gl.maxy
    ORDER BY gps_belong_province DESC, gps_to_center_layer ASC 
$func$ LANGUAGE sql STABLE;

但是错误

"SQL 执行失败 postgres-error : 返回类型不匹配 函数声明返回记录"

正常的查询应该是这样的:

select gl.id , gl.layer_name, ST_Distance(
        ST_AsText(ST_Centroid(ST_GeometryFromText(ST_AsText(ST_MakeEnvelope(gl.minx, gl.miny, gl.maxx, gl.maxy, 4326))))),
        'POINT(109.189083 12.272397)'
    ) as "GPS to center Layer",
    ST_AsText(ST_Centroid(ST_GeometryFromText(ST_AsText(ST_MakeEnvelope(r.minx, r.miny, r.maxx, r.maxy, 4326))))),
ST_contains(
ST_GeometryFromText(ST_AsText(ST_MakeEnvelope(r.minx, r.miny, r.maxx, r.maxy, 4326))),
ST_GeometryFromText('POINT(109.189083 12.272397)')) 
 as "GPS belong Province"
--   
from "GeoLayers" gl join "Regions" r ON gl.province_id = r.id
where gl.deleted_flg = false 
group by gl.id , gl.layer_name, r.minx, r.miny, r.maxx, r.maxy, gl.minx, gl.miny, gl.maxx, gl.maxy
-- having st_contains = false 
order by "GPS belong Province" desc, "GPS to center Layer" asc 
-- limit 10
;

数据返回:

 id    layer_name   GPS to center Layer st_astext   GPS belong Province
"539"  Bản đồ địa chính VIP - Phường Vĩnh Phước, Thành phố Nha Trang, Tỉnh Khánh Hòa"   "0.009276001515402381"  "POINT(112.2530484505 10.3798475845001)"    "t"

【问题讨论】:

    标签: postgresql postgis hasura


    【解决方案1】:

    您的错误消息是声明的列和查询结果不匹配。这里重要的是 1)RETURNS TABLE 中声明的表包含完全相同的列,2)它们的顺序相同,3)它们的数据类型匹配。请参阅以下示例:

    CREATE OR REPLACE FUNCTION myfunc(text,text) 
    RETURNS TABLE(r1 text, r2 text) AS $$
    BEGIN
      RETURN QUERY SELECT $1,$2;
    END; $$ LANGUAGE plpgsql;
    
    SELECT * FROM myfunc('foo','bar');
    
     r1  | r2  
    -----+-----
     foo | bar
    

    .. 或使用 SQL:

    CREATE OR REPLACE FUNCTION myfunc(text,text) 
    RETURNS TABLE(r1 text, r2 text) AS $$
    SELECT $1,$2;
    $$ LANGUAGE SQL;
    
    SELECT * FROM myfunc('foo','bar');
    
     r1  | r2  
    -----+-----
     foo | bar
    

    在您的函数中,声明的列和查询不匹配。快速映射后,我得到:

    • id int539
    • layer_name 文本Bản đồ địa chính VIP - Phường Vĩnh Phước, Thành phố -Nha Trang, Tỉnh Khánh Hòa
    • gps_to_center_layer 数字0.009276001515402381
    • gps_belong_province 布尔值POINT(112.2530484505 10.3798475845001)(这不是布尔值)
    • SELECT 的末尾还有一个未声明的布尔值t

    【讨论】:

      猜你喜欢
      • 2021-03-25
      • 2021-11-13
      • 2019-11-20
      • 1970-01-01
      • 2017-03-19
      • 2011-06-26
      • 2021-11-29
      • 1970-01-01
      • 2012-04-23
      相关资源
      最近更新 更多