在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
相关产品推荐
相关产品推荐

