快速背景:对于PostgreSQL来说非常新,来自SQL Server。我正在努力将存储过程从SQL Server转换为PostgreSQL。我阅读了Postgres 9.3文档并查看了大量示例和问题,但仍无法找到解决方案。
我有这个select语句,我每周执行一次以返回新值
select distinct id, null as charges
, generaldescription as chargedescription, amount as paidamount
from mytable
where id not in (select id from myothertable)
我可以做些什么来将其变成一个我可以每周右键单击并执行的功能。最终,我将使用另一个开发人员构建的程序自动执行此操作。因此,它将在没有用户参与的情况下执行,并将结果通过电子表格发送给用户。不确定最后一部分是否与函数的编写有关。
这是我尝试失败的尝试之一:
CREATE FUNCTION newids
RETURNS TABLE (id VARCHAR, charges NUMERIC
, chargedescription VARCHAR, paidamount NUMERIC) AS Results
Begin
SELECT DISTINCT id, NULL AS charges
, generaldescription AS chargedescription, amount AS paidamount
FROM mytable
WHERE id NOT IN (SELECT id FROM myothertable)
END;
$$ LANGUAGE plpgsql;
我也在使用Navicat,错误是:
必须指定函数结果类型
答案 0 :(得分:4)
你可以在这里使用PL / pgSQL,它甚至可能是更好的选择。
但您需要修复语法错误match your dollar-quoting,添加显式广播(NULL::numeric
)并使用RETURN QUERY
:
CREATE FUNCTION newids_plpgsql()
RETURNS TABLE (
id varchar
, charges numeric
, chargedescription varchar
, paidamount numeric
) AS -- Results -- remove this
$func$
BEGIN
RETURN QUERY
SELECT ...;
END;
$func$ LANGUAGE plpgsql;
或 使用简单的SQL函数:
CREATE FUNCTION newids_sql()
RETURNS TABLE (
id varchar
, charges numeric
, chargedescription varchar
, paidamount numeric
) AS
$func$
SELECT ...;
$func$ LANGUAGE sql;
无论哪种方式,SELECT
语句都可以更有效:
SELECT DISTINCT t.id, NULL::numeric AS charges
, t.generaldescription AS chargedescription, t.amount AS paidamount
FROM mytable t
LEFT JOIN myothertable m ON m.id = t.id
WHERE m.id IS NULL;
当然,所有数据类型必须匹配。我不知道,缺少表格定义
你确定需要DISTINCT
吗?