【问题标题】:Simplify my function to postgres sql query将我的函数简化为 postgresql 查询
【发布时间】:2017-04-14 21:11:05
【问题描述】:

我可以让这个函数变得简单,只在 Postgres 中使用 sql 吗? (不删除,算了) 我只需要选择和插入查询。

我尝试过使用“递归”没有成功。

CREATE OR REPLACE FUNCTION mt_CriarRotaExecutada(id_rota integer)
  RETURNS void AS
$$
DECLARE
    searchsql text := '';
    searchsqlId text := '';
    var_match RECORD;
BEGIN
    EXECUTE('delete from rota_executada where id_rota = ' || CAST( id_rota As text));
    searchsql := 'select (ST_DumpPoints(the_geom)).geom as the_geom,
                         id_destino 
                  from (select id, the_geom, id_destino 
                        from rota_data 
                        where num =' || CAST( id_rota As text) || 
                        ' order by id) a';

    FOR var_match IN EXECUTE(searchsql) 
    LOOP

        EXECUTE 'insert into rota_executada(id_rota, id_rua, id_destino, the_geom, visitado) 
                 select $1, id, $3, $2,  $4 
                 from ruas r 
                 ORDER BY r.the_geom <#> $2 
                 LIMIT 1' 
        USING id_rota, var_match.the_geom, var_match.id_destino, 'N';
    END LOOP;
END;
$$
LANGUAGE 'plpgsql';

谢谢。

【问题讨论】:

  • &lt;#&gt; 是什么运算符?
  • 一点到另一点的距离。 @JuanCarlosOropeza
  • &lt;-&gt;有什么区别?
  • 你不需要执行删除只是DELETE from rota_executada where id_rota = id_rota::text;
  • 根据我使用&lt;-&gt; 的经验,您不能使用LIMIT 1,因为并不总是返回最接近的值,您必须先进行LIMIT 100 然后排序,然后再进行LIMIT 1

标签: postgresql function postgis plpgsql


【解决方案1】:

你不需要EXECUTE只需做sql语句

DELETE from rota_executada where id_rota = id_rota::text;

INSERT INTO rota_executada(id_rota, id_rua, id_destino, the_geom, visitado) 
   SELECT id_rota, id, var_match.id_destino, var_match.the_geom,  'N'
   FROM ruas r 
   ORDER BY r.the_geom <#> var_match.the_geom
   LIMIT 1

【讨论】:

  • 提示:有些地方id_rota 是整数而其他地方是文本,这是没有意义的。标准化您的数据类型以避免错误和错误
  • 但是,--ST_DumpPoints(the_geom) 选择?我不能放弃 st_dumppoints 订单
  • 我没有删除FOR var_match IN EXECUTE(searchsql) 我只是更改了其他两个执行
  • 我认为没有正确解释。我想将函数简化为一个简单的查询。如果可能的话。 (忘记删除)
  • 您可以简化,但您必须计算所有距离,并且性能会更差。我认为这已经是最好的方法了,因为带有索引的LIMIT 1 使它非常快
猜你喜欢
  • 2021-01-11
  • 2014-07-06
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多