PostgreSQL:错误运算符不存在:| |字符变化

PostgreSQL:错误运算符不存在:| |字符变化,postgresql,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

我需要使用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
调用函数:

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
错误

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

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

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
,以对其进行解释

看看这些:


这篇文章包含语法错误

... IN (SELECT cola FROM tablet WHERE colb = || a  ||) || ...
PostgreSQL可以理解这一点,但会尝试搜索一元前缀(和后缀)
|
运算符,默认情况下它们不存在(但是,错误消息说,情况并非如此)

编辑

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
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

对我想知道原因?非常感谢你的帮助。