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

时间:2010-12-07 11:47:53

标签: sql-server sql-server-2005

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

现在,我希望在SQL Server中输出该句子的前两个单词作为输出。即这是。

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

3 个答案:

答案 0 :(得分:13)

您可以按如下方式使用查询:

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

或者在查询中使用时:

SELECT SUBSTRING(field1, 0, CHARINDEX(' ', field1, CHARINDEX(' ', field1, 0)+1)) 
FROM Table

答案 1 :(得分:4)

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

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

CHARINDEX( expressionToFind , expressionToSearch [ , start_location ] )

Charindex将返回第一个索引,在该索引中找到特定的字符串。我们一直在做的是通过添加等于第一个找到的实例+1的start_location来踢球,以便它找到第2,第3,第4个实例等。而且,而不是{ {3}}我们可以使用SUBSTRING(@str, 0,...来捕获字符串的第一部分,但无论如何,计算要走的深度是困难部分:

DECLARE @string VARCHAR(1000) = 'One Two Three';
SELECT LEFT(@string, CHARINDEX(' ', @string,
                     CHARINDEX(' ', @string,
                     CHARINDEX(' ', @string,
                     CHARINDEX(' ', @string)+1)+1)+1))

但如果我们没有最少的字数,这将失败
从技术上讲,它只会无限循环。一旦空间不足,它就会从头开始再次索引

LEFT(@str,...

弹出测验 ...上述查询解决了什么? 将鼠标悬停在下面以获得答案

  

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

Char Index Demo的解决方案中,我们可以检查最后一个CHARINDEX是否产生了非零值,这意味着它在该深度水平上达到了一个空间。但是,由于嵌套的charindex有点笨拙,我们可以通过Extracting a specific number of words from a string in sql

更直接地获取这些信息。

所以最终的解决方案应该像这样抓住第一个 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

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

答案 2 :(得分:1)

仅限ORACLE - 您也可以像这样使用INSTR

SELECT SUBSTR(colName, 0, INSTR(colName,' ',1,2)) FROM table

注意:如果行数据少于2个字,则返回空行