字符串中的前两个单词--sql server

Zer*_*ity 3 sql-server sql-server-2005

我有这样的字符串"这是一个你好世界的例子"

现在我想在SQL Server中输出前两个单词作为输出.即这是.

另一个例子:原句:"完整单词练习"输出:完整单词

小智 13

您可以使用如下查询:

DECLARE @d nvarchar(100)
SET @d = 'Complete word exercise'
SELECT SUBSTRING(@d, 0, CHARINDEX(' ', @d, CHARINDEX(' ', @d, 0)+1))
Run Code Online (Sandbox Code Playgroud)

或者在查询中使用时:

SELECT SUBSTRING(field1, 0, CHARINDEX(' ', field1, CHARINDEX(' ', field1, 0)+1)) 
FROM Table
Run Code Online (Sandbox Code Playgroud)


Kyl*_*Mit 6

对于任何少于 2 个单词的字符串,许多解决方案都会中断,这对于希望解析前n个单词的人来说越来越有可能。

让我们首先看一下查询,然后我们如何判断它是否实际计算正确。
为此,我们需要嵌套多个CHARINDEX语句,这些语句采用以下参数:

CHARINDEX( expressionToFind , expressionToSearch [ , start_location ] )
Run Code Online (Sandbox Code Playgroud)

Charindex 将返回找到特定字符串的第一个索引。我们一直在做的是通过添加start_location等于第一个找到的实例 +1 来将球踢到马路上,这样它就会找到第二个、第三个、第四个实例等。此外,SUBSTRING(@str, 0,...我们可以只用它LEFT(@str,...来捕获第一个字符串的一部分,但无论如何计算要走多远是困难的部分:

DECLARE @string VARCHAR(1000) = 'One Two Three';
SELECT LEFT(@string, CHARINDEX(' ', @string,
                     CHARINDEX(' ', @string,
                     CHARINDEX(' ', @string,
                     CHARINDEX(' ', @string)+1)+1)+1))
Run Code Online (Sandbox Code Playgroud)

但是如果我们没有最少的单词数,这将失败
从技术上讲,它只会无限循环。一旦空间用完,它将从头开始重新编制索引

字符索引演示

流行测验……上述查询将解析为什么?悬停在下方寻找答案

SELECT LEFT('One Two Three', 3) -- 'One'

从 sql 中的字符串提取特定数量的单词中的解决方案中,我们可以检查最后一个是否CHARINDEX产生了非零值,这意味着它在该深度级别命中了一个空格。而且,由于嵌套的 charindex 有点笨拙,我们可以通过计算 SQL varchar 中某个子字符串的出现次数来更直接地获取该信息

所以最终的解决方案应该是这样的,以获取前4 个单词

DECLARE @string VARCHAR(1000) = 'One Two Three Four Five Six';

SELECT CASE WHEN LEN(@string)-LEN(REPLACE(@string, ' ', '')) < 4 
            THEN @string
            ELSE LEFT(@string, CHARINDEX(' ', @string,
                               CHARINDEX(' ', @string,
                               CHARINDEX(' ', @string,
                               CHARINDEX(' ', @string)+1)+1)+1))
       END
Run Code Online (Sandbox Code Playgroud)

如果少于 4 个空格,我们将只返回整个字符串。对于四个以上,我们将找到第 4 个空格的位置并将字符串的左侧部分一直返回到该位置