[英]PostgreSQL: ERROR: operator does not exist: integer = character varying
[英]PostgreSQL: ERROR operator does not exist: || character varying
我需要使用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
||
是用於填充兩段文本的運算符,它要求您在運算符的前后都具有文本(或可轉換為文本的內容),如下所示:
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的能理解這一點,但會盡量尋找一元前綴(以及后綴) ||
運算符,默認情況下不存在( 可以創建它們,但是錯誤消息指出,不是這種情況)
編輯 :
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.