我试图在postgres函数中追加查询中的单引号但导致错误请查看我的postgres函数,
CREATE OR REPLACE function test() returns my_type as $$
declare rd varchar := '56';
declare personphone varchar := 'Philip Dannes';
declare result my_type;
declare SQL VARCHAR(300):=null;
BEGIN
-- Mandatory / Static part of the Query here
SQL = 'select pt.id from product_template pt inner join product_product pp on pt.id=pp.id where ';
IF rd IS NOT NULL
then
SQL = SQL || 'pp.radio_phone = '|| rd;
else
SQL = SQL || 'pp.radio_phone = '|| rd;
end if;
IF personphone IS NOT NULL
then
SQL = SQL || ' and pp.person_phone = '|| personphone;
else
SQL = SQL || ' and pp.person_phone = '|| personphone;
end if;
SQL = SQL || ';';
EXECUTE SQL;
return result;
END
$$ LANGUAGE plpgsql;
当我执行它时,它给了我错误" Philip Daves"并在追加为
之后返回查询Select pt.id from product_template pt inner join product_product pp on pt.id=pp.id where
pp.radio_phone = 56 and pp.person_phone = Philip Dave
我知道错误是因为当我使用单引号执行函数返回查询时,56和Philip Dave不在单引号中它工作正常。
我如何在此查询中附加单引号?
我试过这样的方式,
SQL = SQL || ' and pp.person_phone = '|| '' || personphone;
但我的函数返回相同的查询
希望你的建议
提前致谢
答案 0 :(得分:4)
你需要重写这个。
首先,使用quote_ident
和quote_literal
代替手动引用。
更好的是,如果您使用较新的PostgreSQL版本,请将format()
与%I
和%L
说明符一起用于标识符和文字。
另外,尽量避免像这样迭代地构建字符串。使用尽可能CASE
的表达式构建
不需要任何varchar(300)
业务。只需使用text
。
您的ELSE
条款似乎包含与IF ... THEN
相同的内容。我已将它们删除了。
尝试使用RETURN QUERY EXECUTE
,或者,如果您只获得一个值,EXECUTE ... INTO
。
DECLARE
radiophone_clause text = '';
personphone_clause text = '';
BEGIN
IF rd IS NOT NULL then
radiophone_clause = 'and pp.radio_phone = '|| quote_literal(rd);
END IF;
IF personphone IS NOT NULL then
personphone_clause = ' and pp.person_phone = '|| quote_literal(personphone);
END IF;
RETURN QUERY EXECUTE format('select pt.id from product_template pt inner join product_product pp on pt.id=pp.id where true %s %s', radiophone_clause, personphone_clause);
END;