我很难理解为什么我可以引用returns table(col type)
中的输出列。
在下面的代码中有一个微妙的错误,order by
变量引用returns
中的res
,而不是我们别名为res
的data1
。where
中的res
总是为空,我们得到0行。
为什么我可以在输出中引用列名?
在什么情况下我需要这样做?
CREATE OR REPLACE FUNCTION public.test(var INTEGER)
RETURNS table(res int )
LANGUAGE plpgsql
AS $function$
begin
return query
select data1 res
from table_with_data
where res < var;
end
$function$
2条答案
按热度按时间iugsix8n1#
为什么可以在输出中引用列名
从the manual开始,关于函数参数的部分:
这意味着,在本例中,
res
实际上是一个可写变量,您计划返回一组的类型。与任何其他没有赋值默认值的变量一样,它以null
开头。在什么情况下我需要这个
您可以使用单一
return query
从这种类型的函数传回多笔记录,但另一种方式是使用一系列的多笔return query
或return next
-在第二种情况下,每次都要填入输出数据表之记录中的字段。您可能预期会使用return陈述式来结束函数,但是在这种情况下,只有没有添加任何东西的单个return;
将具有该效果。对于
LOOP
s,哪一项最有用?示例结果
mfuanj7w2#
如果为True,则
OUT
参数(包括RETURNS TABLE (...)
子句中的字段名)在PL/pgSQL函数体中的所有SQL DML语句中都可见,就像其他变量一样。有关详细信息,请参阅手册中的变量替换和从PL/pgSQL的函数返回两章。**但是,**首先是一个更基本的误解。嵌套
SELECT
的语法从一开始就无效。PL/pgSQL变量恰好掩盖了此问题(具有另一个问题)。在SQL中,不能在WHERE
子句中引用输出列名(SELECT
子句中的列别名)。这是无效的:本手册:
输出列的名称可用于引用
ORDER BY
和GROUP BY
子句中的列值,但不能用于引用WHERE
或HAVING
子句中的列值。在这里你必须写出表达式。这与
ORDER BY
不同,您在文本中提到了它,但没有包括在查询中。请参阅:正在修复即时问题
可以这样修理:
fiddle
请参阅:
在这种情况下,列别名只是噪声。函数返回的列名在任何情况下都是
res
-如RETURNS TABLE
子句中所定义的。旁白:建议不要省略列别名的关键字
AS
(不同于表别名)。请参见:如果列名和变量名之间实际存在歧义(比如,您声明了一个
OUT
参数或名为data1
的变量),则会收到如下错误消息:暴力修复
可以在函数体的开头使用特殊命令修复:
请参阅:
正确修复
表限定列名,并避免一开始就冲突的变量名。
示例: