【问题标题】:Extract the first word of a string in a SQL Server query在 SQL Server 查询中提取字符串的第一个单词
【发布时间】:2009-04-01 22:34:12
【问题描述】:

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

【问题讨论】:

    标签: tsql


    【解决方案1】:
    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')
    

    【讨论】:

    • 感谢这个 UDF - 我注意到 select dbo.[FirstWord]('abc def') 将返回 '' 在大多数情况下,您可能想要返回 'abc'
    • 我的话是非ASCII格式,当我使用你的代码时,新列的值设置为????,如何解决?
    【解决方案2】:

    我想在不制作单独函数的情况下做这样的事情,并想出了这个简单的单行方法:

    DECLARE @test NVARCHAR(255)
    SET @test = 'First Second'
    
    SELECT SUBSTRING(@test,1,(CHARINDEX(' ',@test + ' ')-1))
    

    这将返回结果“First”

    它很短,只是没有那么健壮,因为它假设您的字符串不以空格开头。它将处理单字输入、多字输入和空字符串或 NULL 输入。

    【讨论】:

    • 是的,这更符合我的需求。谢谢本。
    • 这太完美了,非常感谢!
    • 对于希望找到一般示例的人来说,这比最佳答案更有意义。
    • 要处理以空格开头的字符串,只需:SELECT SUBSTRING(LTRIM(@test),1,(CHARINDEX(' ',LTRIM(@test) + ' ')-1))
    【解决方案3】:

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

    DECLARE @test NVARCHAR(255)
    SET @test = 'First Second'
    
    SELECT SUBSTRING(LTRIM(@test),1,(CHARINDEX(' ',LTRIM(@test) + ' ')-1))
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        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
        

        警告:这是针对小型数据集(美国联邦种族报告类别);我不知道当规模扩大到巨大数量时性能会发生什么变化。

        【讨论】:

          【解决方案6】:
          DECLARE @string NVARCHAR(50)
          
          SET @string = 'CUT STRING'
          
          SELECT LEFT(@string,(PATINDEX('% %',@string)))
          

          【讨论】:

            【解决方案7】:

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

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

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

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

            【讨论】:

              【解决方案8】:
              对函数稍加调整即可从条目中的起点返回下一个单词 创建函数 [dbo].[GetWord] ( @value varchar(最大值) , @startLocation 整数 ) 返回 varchar(最大值) 作为 开始 SET @value = LTRIM(RTRIM(@Value)) 选择@startLocation = 案子 当@startLocation > Len(@value) THEN LEN(@value) 否则@startLocation 结尾 选择@值 = 案子 当@startLocation > 1 然后 LTRIM(RTRIM(RIGHT(@value, LEN(@value) - @startLocation))) 否则@值 结尾 返回案例 CHARINDEX(' ', @value, 1) 当 0 时 @value ELSE SUBSTRING(@value, 1, CHARINDEX(' ', @value, 1) - 1) 结尾 结尾 去 选择 dbo.GetWord(NULL, 1) 选择 dbo.GetWord('', 1) 选择 dbo.GetWord('abc', 1) SELECT dbo.GetWord('abc def', 4) SELECT dbo.GetWord('abc def ghi', 20)

              【讨论】:

                【解决方案9】:

                试试这个:

                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

                【讨论】:

                  猜你喜欢
                  • 2015-05-08
                  • 2014-11-30
                  • 2020-03-14
                  • 1970-01-01
                  • 2010-10-15
                  • 2017-11-09
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-12-06
                  相关资源
                  最近更新 更多