求助:如何在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
相关产品推荐
相关产品推荐

