簡體   English   中英

PostgreSQL:ERROR運算符不存在: 角色變化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM