首页 > 解决方案 > 如果第一个查询为空,则从第二个查询返回 PostgreSQL 函数

问题描述

我在 Windows 中有一个 PostgreSQL 11x 环境。我试图找出返回查询结果的函数的语法。下面代码中的第一个查询在大多数情况下工作得更好,但如果它未能返回某些内容,那么我想使用第二个查询的返回——这要慢得多,但至少有一些数据被返回。这是我的功能:

CREATE OR REPLACE FUNCTION public.myfunction()
RETURNS TABLE(start_vid bigint, end_vid bigint, agg_cost double precision)
LANGUAGE plpgsql
AS $function$
DECLARE 
--declarations
BEGIN   
 RETURN QUERY
 SELECT  * FROM pgr_dijkstraCost(
        'SELECT gid as id, * FROM ways  as r, 
        (SELECT ST_Expand(ST_Extent(the_geom), ' || box_size || ') as box  FROM ways as edge_table    
        WHERE edge_table.source = ' || VT1 || ' OR edge_table.target = ' || VT2 || ') as box
        WHERE r.the_geom && box.box',
        VT1, VT2, arg_directed_flag::boolean
RETURN QUERY
    SELECT * FROM pgr_dijkstraCost( 'SELECT gid as id, * FROM ways', VT1, VT2, 
   arg_directed_flag::boolean); 
END
$function$

注意:只有当第一个 Select 没有返回任何内容时,我才想执行第二个 SELECT。找不到任何 PostgreSQL 代码来修改我的功能,并且对 PostgreSQL 环境来说相当新。

谢谢!

标签: sqlpostgresqlfunction

解决方案


您可以使用该FOUND变量,即true如果上一个查询返回至少一行

IF (FOUND = FALSE) THEN
 RETURN QUERY
    SELECT * FROM pgr_dijkstraCost( 'SELECT gid as id, * FROM ways', VT1, VT2, 
   arg_directed_flag::boolean); 
END IF;

推荐阅读