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

SQL Server中移除列内尖括号及其中内容的实现方案

解决方案

要移除SQL Server varchar可空列中所有尖括号及其包裹的内容,下面是两种直接可行的实现方式:

递归CTE方法(无需创建函数)

这种方式适合一次性查询,不需要额外创建数据库对象:

WITH RecursiveClean AS (
    -- 初始处理:将NULL转为空字符串,保留原始数据
    SELECT 
        ID,
        CASE WHEN YourColumn IS NULL THEN '' ELSE YourColumn END AS CleanedText
    FROM YourTable
    UNION ALL
    -- 递归替换:每次找到第一个<和对应的>,删除这段内容
    SELECT 
        ID,
        STUFF(CleanedText, CHARINDEX('<', CleanedText), CHARINDEX('>', CleanedText) - CHARINDEX('<', CleanedText) + 1, '')
    FROM RecursiveClean
    -- 终止条件:当文本中不再包含<时停止递归
    WHERE CHARINDEX('<', CleanedText) > 0
)
-- 获取最终处理结果,将空字符串转回NULL(保持原列可空特性)
SELECT 
    ID,
    CASE WHEN CleanedText = '' THEN NULL ELSE CleanedText END AS FinalCleanedText
FROM RecursiveClean
WHERE CHARINDEX('<', CleanedText) = 0
OPTION (MAXRECURSION 0); -- 解除递归次数限制,避免长文本处理中断

自定义函数方法(适合重复调用)

如果需要多次处理这类文本,可以创建一个标量函数,调用更简洁:

创建函数

CREATE FUNCTION dbo.CleanAngleBrackets(@Input VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
    -- 直接返回NULL输入
    IF @Input IS NULL
        RETURN NULL;
    
    DECLARE @TempText VARCHAR(MAX) = @Input;
    
    -- 循环删除所有<...>片段,直到无尖括号为止
    WHILE CHARINDEX('<', @TempText) > 0
    BEGIN
        SET @TempText = STUFF(@TempText, CHARINDEX('<', @TempText), CHARINDEX('>', @TempText) - CHARINDEX('<', @TempText) + 1, '');
    END
    
    -- 处理空字符串,转回NULL匹配原列特性
    RETURN CASE WHEN @TempText = '' THEN NULL ELSE @TempText END;
END;

使用函数查询

SELECT 
    ID,
    dbo.CleanAngleBrackets(YourColumn) AS FinalCleanedText
FROM YourTable;

注意事项

  • 上述代码默认处理非嵌套的尖括号场景,比如abc<def>ghi<jkl>mno会被转为abcghimno。
  • 如果存在嵌套尖括号(比如a<b<c>d>e),代码会先删除最外层的<b<c>部分,得到ad>e,剩余的>会保留。如果需要处理嵌套场景,需要额外调整逻辑来匹配对应的闭合尖括号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:29:51