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

求助:如何在SQL Server中提取文本中的第3个单词

提取SQL Server中文本的第3个单词

嘿,我来帮你搞定提取第三个单词的需求!你之前的语句是用来抓第二个单词的,咱们稍微调整下逻辑就能实现目标,下面给你几种不同的方案,适配不同的SQL Server版本~

方法1:基于SUBSTRING和CHARINDEX的传统写法

这个方法不依赖任何高版本函数,兼容性拉满,完全基于你现有的思路扩展。核心就是多定位一次空格——原来你找了两次空格来锁定第二个单词,现在要找第三次空格,以此确定第三个单词的起始和结束位置:

DECLARE @sentence NVARCHAR(MAX) = 'Hello World This Is A Test';

SELECT 
    SUBSTRING(
        @sentence,
        -- 找到第二个空格的位置,再加1就是第三个单词的起始点
        CHARINDEX(' ', @sentence, CHARINDEX(' ', @sentence) + 1) + 1,
        -- 计算第三个单词的长度:用第三个空格的位置减去起始点,如果没有第三个空格就取到字符串末尾
        ISNULL(
            CHARINDEX(' ', @sentence, CHARINDEX(' ', @sentence, CHARINDEX(' ', @sentence) + 1) + 1),
            LEN(@sentence) + 1
        ) - (CHARINDEX(' ', @sentence, CHARINDEX(' ', @sentence) + 1) + 1)
    ) AS ThirdWord;

如果句子不足3个单词,这个语句会返回NULL,你可以根据需求改成返回空字符串或者其他默认值~

方法2:用STRING_SPLIT(SQL Server 2016+)

如果你的SQL Server版本是2016及以上,用STRING_SPLIT拆分字符串会简洁太多!不过要注意版本差异:

SQL Server 2022及以上(推荐)

2022版本之后,STRING_SPLIT新增了ordinal参数,直接返回每个单词的顺序,用起来超省心:

DECLARE @sentence NVARCHAR(MAX) = 'Hello World This Is A Test';

SELECT value AS ThirdWord
FROM STRING_SPLIT(@sentence, ' ', 1) -- 第三个参数1表示返回顺序列ordinal
WHERE ordinal = 3;

SQL Server 2016-2019版本

旧版本没有ordinal参数,我们可以用ROW_NUMBER()来模拟顺序,同时过滤掉连续空格产生的空字符串:

DECLARE @sentence NVARCHAR(MAX) = 'Hello World This Is A Test';

SELECT value AS ThirdWord
FROM (
    SELECT 
        value,
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn
    FROM STRING_SPLIT(@sentence, ' ')
    WHERE value <> '' -- 过滤连续空格导致的空值
) AS SplitWords
WHERE rn = 3;

方法3:用XML拆分(兼容所有SQL Server版本)

要是你还在使用非常老的SQL Server版本(比如2008及以前),XML拆分是个靠谱的兼容方案:

DECLARE @sentence NVARCHAR(MAX) = 'Hello World This Is A Test';

-- 先处理连续空格,把多个空格替换成单个
SET @sentence = REPLACE(REPLACE(@sentence, ' ', '><'), '><', ' ');

SELECT 
    SplitWords.value('(/root/item[3])[1]', 'NVARCHAR(MAX)') AS ThirdWord
FROM (
    SELECT CAST('<root><item>' + REPLACE(@sentence, ' ', '</item><item>') + '</item></root>' AS XML) AS XmlData
) AS XmlTable
CROSS APPLY XmlData.nodes('/root/item') AS Nodes(SplitWords);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:37:30