在查询Postgres函数中追加单引号?

2024-06-09 18:33:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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”的错误,并在附加为后返回查询

^{pr2}$

我知道错误是因为56和Philip Dave不在单引号中,当我执行函数return query with single quote时,它工作得很好。在

如何在这个查询中追加单引号??在

我试着用这种方式

SQL = SQL || ' and pp.person_phone = '|| '' || personphone;

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

希望你的建议

提前谢谢


Tags: and函数ptidsqlphonepostgresphilip
1条回答
网友
1楼 · 发布于 2024-06-09 18:33:32

你需要重写得很重。在

首先,使用quote_ident和{},而不是手动引用。在

如果您使用的是更新的PostgreSQL版本,那么最好将format()和{}和{}说明符一起使用。在

另外,尽量避免像那样迭代地构建字符串。尽可能使用带有CASEs的表达式进行构建

没有必要做任何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 ^{} and ^{}。在

相关问题 更多 >