考虑以下示例函数:
CREATE FUNCTION test()
RETURNS INTEGER
LANGUAGE SQL
AS $$ SELECT * FROM UNNEST(ARRAY[1,2,3,4,5]); $$
;
当我们这样执行时:
SELECT test();
我们得到的结果是1
。换句话说,该函数只返回结果集的第一个元素。
我有一个便利功能,可以根据行的其余部分中的数据检索ID。它允许调用者查询通常对特定行唯一但不是严格唯一的数据。首先,它将用于填充一些主要是静态数据。允许调用使用行数据而不是对ID进行硬编码,这使得它在新数据出现时更易读,更易于维护。这取决于呼叫者是否熟悉数据,但这是一个合理的假设,可用于手头的使用。
问题是如果用户犯了错误并且提供的参数不足以将查询结果过滤到一行,我希望我的函数出错而不是返回第一个结果。我怎么能做到这一点?除了将我的语言切换到PL / PGSQL并手动检查之外,我还有其他选择吗?
(使用PostgreSQL 9.3)。
答案 0 :(得分:3)
您可以将整个查询作为子查询放在SELECT列表中。尝试返回多行时,这将失败,并显示以下错误:
错误:用作表达式
的子查询返回多行
根据你的例子,这个会失败:
CREATE FUNCTION test()
RETURNS INTEGER
LANGUAGE SQL
AS $$ SELECT (SELECT * FROM UNNEST(ARRAY[1,2,3,4,5])); $$
这个人不会失败:
CREATE FUNCTION test()
RETURNS INTEGER
LANGUAGE SQL
AS $$ SELECT (SELECT * FROM UNNEST(ARRAY[1])); $$