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

在PL/SQL中复刻T-SQL的STUFF()函数的最优方法是什么

Oracle实现SQL Server STUFF()函数的最简方案

SQL Server中的STUFF()函数逻辑为:在指定字符串的目标位置删除指定长度的内容,再插入新的字符串,Oracle无需编写大量代码即可实现等效效果,两种可选方案如下:

方案1:原生函数组合(无需自定义对象)

直接用SUBSTR加Oracle原生字符串拼接运算符||即可实现,语法如下:

SUBSTR(原字符串, 1, 起始位置 - 1) || 待插入字符串 || SUBSTR(原字符串, 起始位置 + 要删除的长度)

示例:要实现和SQL Server中STUFF('abcdef', 2, 3, 'xyz')等效的效果,Oracle写法为:

SELECT SUBSTR('abcdef', 1, 1) || 'xyz' || SUBSTR('abcdef', 5) AS result FROM DUAL;

执行结果为axyzef,和STUFF()返回完全一致。
该方案性能优于正则实现,不需要创建额外的数据库对象,适合临时使用场景。

方案2:封装自定义函数(高频场景更便捷)

如果需要经常使用该功能,可以一次性封装自定义STUFF函数,后续可直接和SQL Server中一样调用:

CREATE OR REPLACE FUNCTION STUFF(
    p_source_str VARCHAR2,
    p_start_pos INT,
    p_delete_len INT,
    p_insert_str VARCHAR2
) RETURN VARCHAR2
IS
BEGIN
    RETURN SUBSTR(p_source_str, 1, p_start_pos - 1) || p_insert_str || SUBSTR(p_source_str, p_start_pos + p_delete_len);
END STUFF;
/

封装完成后调用示例:

SELECT STUFF('abcdef', 2, 3, 'xyz') AS result FROM DUAL;

边界情况说明

  • 若起始位置大于原字符串长度,会直接把待插入字符串拼接到原字符串末尾,和SQL Server STUFF()逻辑一致
  • 若删除长度为0,仅会在指定位置插入字符串,不会删除原有内容
  • 若删除长度超过起始位置后剩余的字符数,会删除起始位置后的所有内容再插入新字符串

内容的提问来源于stack exchange,提问作者Seyi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:15:03