在SQL Server查询中提取字符串的第一个单词

时间:2009-04-01 22:34:13

标签: tsql

在sql server query中提取字符串的第一个单词的最佳方法是什么?

9 个答案:

答案 0 :(得分:64)

SELECT CASE CHARINDEX(' ', @Foo, 1)
     WHEN 0 THEN @Foo -- empty or single word
     ELSE SUBSTRING(@Foo, 1, CHARINDEX(' ', @Foo, 1) - 1) -- multi-word
END

您也许可以在UDF中使用它:

CREATE FUNCTION [dbo].[FirstWord] (@value varchar(max))
RETURNS varchar(max)
AS
BEGIN
    RETURN CASE CHARINDEX(' ', @value, 1)
        WHEN 0 THEN @value
        ELSE SUBSTRING(@value, 1, CHARINDEX(' ', @value, 1) - 1) END
END
GO -- test:
SELECT dbo.FirstWord(NULL)
SELECT dbo.FirstWord('')
SELECT dbo.FirstWord('abc')
SELECT dbo.FirstWord('abc def')
SELECT dbo.FirstWord('abc def ghi')

答案 1 :(得分:35)

我想在没有单独功能的情况下做这样的事情,并提出了这种简单的单行方法:

DECLARE @test NVARCHAR(255)
SET @test = 'First Second'

SELECT SUBSTRING(@test,1,(CHARINDEX(' ',@test + ' ')-1))

这将返回结果“First”

它很简短,但不那么强大,因为它假设你的字符串不是以空格开头的。它将处理单字输入,多字输入和空字符串或NULL输入。

答案 2 :(得分:5)

RETURN语句之前添加以下内容将解决字段中包含前导空格的情况:

SET @Value = LTRIM(RTRIM(@Value))

答案 3 :(得分:4)

通过应用LTRIM(),即使字符串以空格开头,也增强了Ben Brandt的补偿。试图编辑他的答案但拒绝,所以我现在分别在这里发布。

DECLARE @test NVARCHAR(255)
SET @test = 'First Second'

SELECT SUBSTRING(LTRIM(@test),1,(CHARINDEX(' ',LTRIM(@test) + ' ')-1))

答案 4 :(得分:3)

Marc的回答让我大部分都得到了我需要的东西,但我不得不使用patIndex而不是charIndex,因为有时候除了空格之外的字符标记了我数据的结尾。在这里,我使用'%[ /-]%'来寻找空格,斜线或短划线。

Select race_id, race_description
    , Case patIndex ('%[ /-]%', LTrim (race_description))
        When 0 Then LTrim (race_description)
        Else substring (LTrim (race_description), 1, patIndex ('%[ /-]%', LTrim (race_description)) - 1)
    End race_abbreviation
from tbl_races

结果...

race_id  race_description           race_abbreviation
-------  -------------------------  -----------------
1        White                      White
2        Black or African American  Black
3        Hispanic/Latino            Hispanic

警告:这是针对小型数据集(美国联邦竞赛报告类别);我不知道在扩大到大数目时会对性能产生什么影响。

答案 5 :(得分:3)

BoardView

答案 6 :(得分:1)

从指定字段中提取第一个单词:

SELECT SUBSTRING(field1, 1, CHARINDEX(' ', field1)) FROM table1;

从指定字段中提取第二个和连续的单词:

SELECT SUBSTRING(field1, CHARINDEX(' ', field1)+1, LEN (field1)-CHARINDEX(' ', field1)) FROM table1;

答案 7 :(得分:0)

A slight tweak to the function returns the next word from a start point in the entry

    CREATE FUNCTION [dbo].[GetWord] 
    (
        @value varchar(max)
        , @startLocation int
    ) 
    RETURNS varchar(max) 
    AS 
      BEGIN 

         SET @value = LTRIM(RTRIM(@Value))  
         SELECT @startLocation = 
                CASE 
                    WHEN @startLocation > Len(@value) THEN LEN(@value) 
                    ELSE @startLocation 
                END

            SELECT @value = 
                CASE 
                    WHEN @startLocation > 1 
                        THEN LTRIM(RTRIM(RIGHT(@value, LEN(@value) - @startLocation)))
                    ELSE @value
                END

            RETURN CASE CHARINDEX(' ', @value, 1) 
                    WHEN 0 THEN @value 
                    ELSE SUBSTRING(@value, 1, CHARINDEX(' ', @value, 1) - 1) 
                END

     END 
    GO

    SELECT dbo.GetWord(NULL, 1) 
    SELECT dbo.GetWord('', 1) 
    SELECT dbo.GetWord('abc', 1) 
    SELECT dbo.GetWord('abc def', 4) 
    SELECT dbo.GetWord('abc def ghi', 20) 

答案 8 :(得分:0)

试试这个:

Select race_id, race_description
, Case patIndex ('%[ /-]%', LTrim (race_description))
    When 0 Then LTrim (race_description)
    Else substring (LTrim (race_description), 1, patIndex ('%[ /-]%', LTrim (race_description)) - 1)
End race_abbreviation

来自tbl_races