postgresql - 查询返回语句 - 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$;
解决方案
如果只想返回一组单表,使用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
使用函数后检查变量。
推荐阅读
- python - Odoo python,仅当前订单中的产品价格历史
- php - 如何只允许管理员能够使用 laravel 删除/编辑用户信息?
- google-cloud-platform - Google Calendar API:如何避免域内部访客的 403 使用限制?
- javascript - 在 mustachejs 中以未转义的 html 呈现变量
- mongoose - TypeError:无法读取未定义的属性“创建”
- scripting - 如何在 OpenTest 框架中实现拆卸
- python - 使用 Click 在命令行应用程序中对断言进行单元测试
- python - 在 Databricks 中读取 blob 存储中的数据
- geolocation - 最新 CSV 中的 Maxmind 免费 GeopIP 编码问题
- vb.net - 如何将 DataGridView 的一部分复制到剪贴板?