Function PostgreSQL函数中的多个结果引发错误

Function PostgreSQL函数中的多个结果引发错误,function,postgresql,Function,Postgresql,考虑以下示例函数: CREATE FUNCTION test() RETURNS INTEGER LANGUAGE SQL AS $$ SELECT * FROM UNNEST(ARRAY[1,2,3,4,5]); $$ ; 当我们这样执行时: SELECT test(); 我们得到的结果是1。换句话说,函数只返回结果集的第一个元素 我有一个方便的函数,它根据行其余部分的数据检索ID。它允许调用者查询通常对特定行唯一但并非严格唯一的数据。它主要用于填充一些静态数据。允许调用使用行

考虑以下示例函数:

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)。

您可以将整个查询作为子查询放入选择列表中。尝试返回多行时,将失败,并出现以下错误:

错误:用作表达式的子查询返回多行

根据您的示例,此选项将失败:

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])); $$