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

如何在SQL中批量去除VARCHAR字符串中<>包裹的内容?

批量去除VARCHAR字符串中所有< >包裹内容的SQL实现

在SQL Server中,要批量清理所有被<和>包裹的内容,仅靠单次CHARINDEX或PATINDEX无法完成,需要循环或递归处理直到所有匹配项都被移除,以下是两种可行方案:

方案一:循环处理法

适合处理单条字符串或小批量数据,逻辑直观易懂:

DECLARE @inputStr VARCHAR(MAX) = '这是测试内容<br>包含<example@mail.com>和<br />标签的文本'
DECLARE @startPos INT, @endPos INT

WHILE PATINDEX('%<%>%', @inputStr) > 0
BEGIN
    SET @startPos = PATINDEX('%<%>%', @inputStr)
    SET @endPos = CHARINDEX('>', @inputStr, @startPos)
    SET @inputStr = STUFF(@inputStr, @startPos, @endPos - @startPos + 1, '')
END

SELECT @inputStr AS 清理后内容
  • PATINDEX('%<%>%', @inputStr):定位第一个<开头、>结尾的片段位置
  • CHARINDEX('>', @inputStr, @startPos):找到对应<后面最近的>位置
  • STUFF函数:将从@startPos到@endPos的片段替换为空字符串
  • 循环执行直到没有匹配的<>片段为止

方案二:递归CTE法

适合批量处理表中数据,无需变量循环:

CREATE TABLE #TestData (ID INT, OriginalStr VARCHAR(MAX))
INSERT INTO #TestData VALUES
(1, '文本1<br>带<abc@xyz.com>的内容'),
(2, '文本2<br />包含<自定义标签>的字符串')

;WITH CleanedCTE AS (
    SELECT 
        ID,
        OriginalStr AS CleanedStr,
        PATINDEX('%<%>%', OriginalStr) AS MatchPos
    FROM #TestData
    UNION ALL
    SELECT 
        ID,
        STUFF(CleanedStr, MatchPos, CHARINDEX('>', CleanedStr, MatchPos) - MatchPos + 1, '') AS CleanedStr,
        PATINDEX('%<%>%', STUFF(CleanedStr, MatchPos, CHARINDEX('>', CleanedStr, MatchPos) - MatchPos + 1, '')) AS MatchPos
    FROM CleanedCTE
    WHERE MatchPos > 0
)
SELECT ID, CleanedStr AS 清理后内容
FROM CleanedCTE
WHERE MatchPos = 0
OPTION (MAXRECURSION 0) -- 若字符串过长,需设置递归次数上限,0表示无限制

DROP TABLE #TestData
  • 递归CTE先初始化所有数据,然后每次递归清理一个<>片段,直到MatchPos为0(无匹配项)
  • OPTION (MAXRECURSION 0):如果待处理字符串中包含大量<>片段,需要解除递归次数限制(默认递归次数为100)

注意事项

  • 若字符串中存在未闭合的<或>(比如只有<没有>),以上方法会忽略未闭合的部分
  • 对于超大长度的VARCHAR(MAX)字符串,递归CTE的效率可能略低于循环法,可根据实际场景选择

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:25:38