在Query Postgres函数中附加单引号?

时间:2014-05-27 05:46:52

标签: python sql postgresql postgresql-9.1 concat

我试图在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;

但我的函数返回相同的查询

希望你的建议

提前致谢

1 个答案:

答案 0 :(得分:4)

你需要重写这个。

首先,使用quote_identquote_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;

请参阅the manual for info on quote_ident and quote_literal