PostgreSQL:ERROR运算符不存在:||性格变化

时间:2014-07-11 11:19:09

标签: postgresql

我需要使用string_agg()函数检查函数内的条件,并需要将其赋值给变量。分配后我需要用值执行变量。

示例

create or replace function funct1(a int,b varchar)
returns void as
$$
declare
        wrclause varchar := '';
        sqlq varchar ;
        t varchar;
begin
     IF (b IS NOT NULL ) THEN 
        wrclause := 'AND b IN ('|| b || ')';
     END IF;


     sqlq := string_agg('select *, abcd as "D" from ' ||table_namess,' Union all ') as namess
     from tablescollection2 ud
     inner join INFORMATION_SCHEMA.Tables so on ud.table_namess = so.Table_name
     WHERE cola NOT IN (SELECT cola FROM tablet WHERE colb = || a  ||) || wrclause; /* Error occurred here at  = || a */

     raise info '%',sqlq;

     execute sqlq into t;

     raise info '%',t;
end;
$$
language plpgsql;

调用函数

select funct1(1,'1,2,3');

错误

ERROR:  operator does not exist: || integer

2 个答案:

答案 0 :(得分:1)

||是一个用于连接两段文本的运算符,它要求您在运算符之前和之后都有文本(或可转换为文本的内容),如下所示:

select 'a' || 'b'
select 'a' || 3

所以虽然这些似乎是有效的:

wrclause := 'AND b IN ('|| b || ')';
sqlq := string_agg('select *, abcd as "D" from ' ||table_namess,' Union all ') as namess

这绝对不是:

WHERE cola NOT IN (SELECT cola FROM tablet WHERE colb = || a  ||) || wrclause;

你想在这里实现什么目标?

看起来您可能正在尝试动态构建查询。你需要记住,你不能将自由文本与SQL混合,并期望Postgres对其进行排序,没有编程或查询语言可以做到这一点。

如果这是你的意图,你应该首先完整地构建查询字符串(在一个变量中),然后用它调用EXECUTE来解释它。

看看这些:

答案 1 :(得分:1)

这篇文章包含语法错误

... IN (SELECT cola FROM tablet WHERE colb = || a  ||) || ...

PostgreSQL 可以理解这一点,但会尝试搜索一致的前缀(和后缀)||运算符,默认情况下不存在(但是can be created,但错误信息表明,情况并非如此)

修改

F.ex。这些是数字上有效的(预定义的)一元运算符:

SELECT |/ 25.0, -- prefix, square root, result: 5.0
       5 !,     -- postfix, factorial, result: 120,
       @ -5,    -- prefix, absolute, result: 5
       @ -5 !;  -- mixed, result: 120