2010-11-30 50 views
0

我有一個基於提供的參數動態生成的select語句。問題是,postgresql總是說:PL/pgSQL中的變量替換

argument of WHERE must be type boolean, not type character varying不管參數是什麼。我錯過了什麼嗎?

CREATE OR REPLACE FUNCTION getuid(name character varying) RETURNS integer AS $$ 
    DECLARE 
     statement varchar; 
     uid integer; 
    BEGIN 
     IF ($1 = '') THEN 
      statement := 'TRUE'; 
      statement := CAST(statement AS BOOLEAN); 
     ELSE 
      statement := 'users.keywords ILIKE''' || '%' || $1 || '%'''; 
     END IF; 
     SELECT INTO uid id FROM users WHERE "statement"; 
     RETURN uid; 
    END; 
$$ LANGUAGE plpgsql 

回答

2

如果要在函數內部生成動態命令,則需要EXECUTE。你也可以使用兩個不同的部分:

CREATE OR REPLACE FUNCTION getuid(name character varying) RETURNS integer AS $$ 
    DECLARE 
     statement varchar; 
     uid integer; 
    BEGIN 
     IF ($1 = '' OR $1 IS NULL) THEN -- section 1 
      SELECT id INTO uid FROM users; 
     ELSE -- section 2 
      SELECT id INTO uid FROM users WHERE users.keywords ILIKE '%' || $1 || '%'; 
     END IF; 

     RETURN uid; 
    END; 
$$ LANGUAGE plpgsql;