PGSQL函数参数传递异常:标签LIKE查询拼接失效问题排查
解决方案
首先纠正手动查询的问题:正确匹配任意位置标签的SQL需要用百分号通配符和单引号包裹字符串,写法如下:
SELECT amount FROM donations WHERE message LIKE '%#testing1%';
针对你“匹配message中任意位置的#tag并对关联行的amount求和”的需求,以下是正确的PL/pgSQL函数写法:
方案1:静态SQL(推荐,安全简洁)
CREATE OR REPLACE FUNCTION sum_tag(tag TEXT) RETURNS NUMERIC AS $$ BEGIN RETURN (SELECT SUM(amount) FROM donations WHERE message LIKE CONCAT('%#', tag, '%')); END; $$ LANGUAGE plpgsql;
调用方式:
SELECT sum_tag('testing1');
原函数无效的原因
- 原函数返回类型设为
VOID,无法返回求和结果; - PL/pgSQL中直接执行
SELECT语句但不处理结果(如返回或存入变量)会报错,这里用RETURN (SELECT ...)直接返回求和值; - 需求是求和,需用
SUM(amount)而非单纯查询amount列。
方案2:动态SQL(需动态构造查询时使用)
若必须使用动态SQL,要通过format的%L正确转义字符串避免SQL注入,同时拼接通配符:
CREATE OR REPLACE FUNCTION sum_tag(tag TEXT) RETURNS NUMERIC AS $$ DECLARE total NUMERIC; BEGIN EXECUTE format('SELECT SUM(amount) FROM donations WHERE message LIKE ''%%#%L%%''', tag) INTO total; RETURN total; END; $$ LANGUAGE plpgsql;
注:format中用%%表示单个%,%L会自动为参数添加单引号并转义特殊字符。
内容的提问来源于stack exchange,提问作者Scyne
相关产品推荐
相关产品推荐

