2

plpgsql 函数:

CREATE OR REPLACE FUNCTION testarray (int[]) returns int as $$
  DECLARE
    len int;
  BEGIN
    len := array_upper($1);
  return len;
  END
$$ language plpgsql;

node-postgres 查询 + 测试数组:

var ta = [1,2,3,4,5];
client.query('SELECT testarray($1)', [ta], function(err, result) {
  console.log('err: ' + err);
  console.log('result: ' + result);
});

节点服务器的输出:

err:错误:数组值必须以“{”开头或维度信息
结果:未定义

我还尝试在客户端查询中转换参数,就像testarray($1::int[])返回相同的错误一样。

我将函数参数更改为(anyarray int),输出错误更改为:

错误:错误:整数的无效输入语法:“1,2,3,4,5”
结果:未定义

以及其他几个变体。

我寻找不产生错误并返回 5 的变体。

我阅读了关于Postgres parse-array 问题和关于 node-postgres 中参数化数组的这个 stackoverflow 问题:

但答案似乎并不存在。

4

3 回答 3

3

参数必须采用以下形式之一:

'{1,2,3,4,5}'         -- array literal
'{1,2,3,4,5}'::int[]  -- array literal with explicit cast
ARRAY[1,2,3,4,5]      -- array constructor

此外,您可以简化功能:

CREATE OR REPLACE FUNCTION testarray (int[])
  RETURNS int AS
$func$
BEGIN
  RETURN array_length($1, 1);
END
$func$ LANGUAGE plpgsql IMMUTABLE;

或者一个简单的 SQL 函数:

CREATE OR REPLACE FUNCTION testarray2 (int[])
  RETURNS int AS 'SELECT array_length($1, 1)' LANGUAGE sql IMMUTABLE;

或者直接使用array_length($1, 1)

  • array_upper()错误的功能。数组可以有任意下标。array_length()做你正在寻找的东西。相关问题:

  • 两者都array_length()需要array_upper()两个参数。第二个是数组维度-1在您的情况下。

于 2012-11-11T02:27:13.953 回答
0

感谢 PinnyM 和 Erwin 的回复。我查看了选项并重新阅读了相关答案。

Erwin 描述的数组格式在 node-postgres 中的工作方式如下:

'select testarray(' + "'{1,2,3,4,5}'" + ')'
'select testarray(' + "'{1,2,3,4,5}'" + '::INT[])'
'select testarray(ARRAY[1,2,3,4,5])'

tl:dr 的javascript 引用

在 node-postgres 中参数化它们:(基于这个答案

var ta = [1,2,3,4,5];
var tas = '{' + ta.join() + '}';

...skipped over the pg connect code

client.query("select testarray($1)", [tas] ...
client.query("select testarray($1::int[])", [tas] ...
not sure about the ARRAY constructor.
于 2012-11-11T07:32:59.640 回答
-2

根据您发布的答案,这可能对您有用:

var ta = [1,2,3,4,5];
var params = [];
for(var i = 1, i <= ta.length; i++) {
    params.push('$'+i);
}
var ta = [1,2,3,4,5];
client.query('SELECT testarray(\'{' + params.join(', ') + '}\')', ta, function(err, result) {
  console.log('err: ' + err);
  console.log('result: ' + result);
});
于 2012-11-11T02:26:05.750 回答