我需要使用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
答案 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