我试图将SQL查询的结果传递给函数,但是我遇到了语法错误。
contacts=> SELECT count(*) FROM update_name(contact_ids := select array(select id from contact where name is NULL));
ERROR: syntax error at or near "select"
LINE 1: SELECT count(*) FROM update_name(contact_ids := select array...
subselect返回BIGINTs,函数接受BIGINTs数组。我验证了运行subselect并将结果转换为BIGINTs数组。
切换到positional notation没有任何区别。使用Array constructor也没有改变任何内容。
根据直觉,我把这个论点包裹在parens中:
SELECT count(*) FROM update_name(contact_ids := (select array(select id from contact where name is NULL)));
有效。我不明白为什么。 docs on expressions状态函数调用中的参数是表达式。函数调用和数组构造函数是表达式,因此至少使用Array构造函数应该有效。
为什么我需要parens?必要性来自何处,即我怎么知道?
答案 0 :(得分:1)
您正在使用的表达式称为Scalar Subquery。手册说:
标量子查询是括号中的普通SELECT查询 只返回一行一行...执行SELECT查询 单个返回值用于周围值表达式。
您的子查询返回一个值(恰好是一个数组,根据另一个子查询的结果准备)。
作为一个基本的经验法则,子查询总是在括号中。