首页 > 解决方案 > 查询返回语句 - PostgreSQL

问题描述

我有这个问题,我正在从 SQL Server 迁移到 PostgreSQL 12。

我正在尝试完成的场景:

该函数应该有一个 RETURN 语句,无论是 SETOF 'tableType' 还是 RETURN TABLE (一些列数)

正文以记录计数开始,如果根据输入参数没有找到记录,则简单地返回零(0),否则返回 RETURN 语句中定义的整个记录​​集。

SQL Server 或 Oracle 中的等效部分是:他们只需将 SELECT 语句放入过程中即可完成此操作。但是,对于 PostgreSQL,这是一种困难。

有什么建议,请。

我现在仍然可以完成的工作 - 如果没有找到记录,它将简单地返回 NULL,可能正在使用 PERFORM,或者可能选择 NULL 作为返回 tableType 列的列名。

我希望我清楚!

我想要的是 -

==================================================== ==========

CREATE OR REPLACE FUNCTION public.get_some_data(
    id integer)
    RETURNS TABLE ( id_1 integer, name character varying )

    LANGUAGE 'plpgsql'



AS $BODY$

 DECLARE 

 p_id alias for $1;
 v_cnt integer:=0;

BEGIN

    SELECT COUNT(1) FROM public.exampleTable e
    WHERE id::integer = e.id::integer;

    IF v_cnt= 0 THEN
        SELECT 0;
    ELSE

    SELECT
       a.id, a.name
        public.exampleTable a 
        where a.id = p_id;
END;
$BODY$;

标签: postgresqlplpgsql

解决方案


如果只想返回一组单表,使用returns setof some_table确实是最简单的方法。执行此操作的最基本的 SQL 函数是:

create function get_data()
   returns setof some_table
as
$$
  select * 
  from some_table;
$$
language sql;

PL/pgSQL 并不是真正需要将 SELECT 语句放入函数中,但如果您需要做其他事情,则需要在 PL/pgSQL 函数中使用 RETURN QUERY:

create function get_data()
   returns setof some_table
as
$$
begin
  return query
    select * 
    from some_table;
end;
$$
language plpgsql;

一个函数作为一个返回类型。你不能有一个函数有时返回一个整数,有时返回数千行和十几列。

如果您坚持退回某些东西,您唯一能做的就是这样:

create function get_data()
   returns setof some_table
as
$$
begin
  return query
    select * 
    from some_table;

  if not found then  
    return query 
      select (null::some_table).*;
  end if;
end;
$$
language plpgsql;

但我认为上述是一个非常丑陋和令人困惑(不是说愚蠢)的解决方案。我当然不会让它通过代码审查。


函数的调用者可以测试是否以与我实现那个丑陋的黑客相同的方式返回了某些东西:found使用函数后检查变量。


推荐阅读