You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:05:44