PostgreSQL的PL/pgSQL中能否实现类C/C#风格复合赋值运算符?
PostgreSQL是否支持自定义
+=这类复合赋值运算符? 结论:不支持,无法通过CREATE OPERATOR实现C、C#风格的复合赋值语法。
核心原因
CREATE OPERATOR仅能定义SQL层面的纯计算类二元/一元操作符,本质是将自定义符号映射为「接收输入值、返回计算结果」的函数,不支持产生修改左操作数、给变量赋值这类副作用。- 赋值是PL/pgSQL语法解析层的特殊逻辑,仅识别
:=(兼容写法=)作为赋值标记,不属于用户可自定义扩展的语法范畴。就算尝试定义包含=的自定义操作符,解析器也不会将其识别为赋值动作,会直接抛出语法错误。 - 就算重载
+操作符实现文本拼接能力,v_my_text + '追加文本'也只会返回拼接后的新值,不会自动把结果写回原变量,本质和内置的||拼接符没有区别,仍然需要手动写赋值语句,达不到+=省略左值重复书写的效果。
现有替代写法
目前PL/pgSQL中实现字符串追加的标准原生写法就是你列出的等价形式,没有更短的内置语法:
v_my_text := v_my_text || 'some more text to be added to existing value of v_my_text';
如果是高频拼接场景,可以封装通用拼接函数减少重复逻辑,但仍然无法省略显式赋值步骤:
-- 自定义字符串追加函数示例 CREATE OR REPLACE FUNCTION str_append(original text, append_content text) RETURNS text AS $$ BEGIN RETURN original || append_content; END; $$ LANGUAGE plpgsql IMMUTABLE; -- 调用方式 v_my_text := str_append(v_my_text, 'some more text to be added to existing value of v_my_text');
注:截至PostgreSQL 16正式版,官方既没有内置
+=这类复合赋值语法,也没有开放自定义赋值类运算符的扩展入口,不需要在CREATE OPERATOR方向尝试实现该需求。
内容的提问来源于stack exchange,提问作者zoran
相关产品推荐
相关产品推荐

