语法错误将SQL结果传递给PostgreSQL函数接受数组

时间:2015-06-05 06:38:32

标签: sql arrays postgresql postgresql-9.3

我试图将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?必要性来自何处,即我怎么知道?

1 个答案:

答案 0 :(得分:1)

您正在使用的表达式称为Scalar Subquery。手册说:

  

标量子查询是括号中的普通SELECT查询   只返回一行一行...执行SELECT查询   单个返回值用于周围值表达式。

您的子查询返回一个值(恰好是一个数组,根据另一个子查询的结果准备)。

作为一个基本的经验法则,子查询总是在括号中。