PostgreSQL:错误运算符不存在:| |字符变化
我需要使用string_agg()函数检查函数中的条件,并需要将其分配给变量。赋值后,我需要执行带有值的变量 示例: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
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
对我想知道原因?非常感谢你的帮助。