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

hol*_*ira 35 t-sql

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

Mar*_*ell 66

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

你也许可以在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')
Run Code Online (Sandbox Code Playgroud)

  • 感谢这个 UDF - 我注意到 select dbo.[FirstWord](' abc def') 将返回 '' 在大多数情况下,您可能想返回 'abc' (2认同)

Ben*_*ndt 36

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

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

SELECT SUBSTRING(@test,1,(CHARINDEX(' ',@test + ' ')-1))
Run Code Online (Sandbox Code Playgroud)

这将返回结果"First"

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

  • 是的,这更符合我的需求.谢谢Ben. (2认同)
  • 要处理以空格开头的字符串,只需执行以下操作:`SELECT SUBSTRING(LTRIM(@test),1,(CHARINDEX(' ',LTRIM(@test) + ' ')-1))` (2认同)

小智 7

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

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

SELECT SUBSTRING(LTRIM(@test),1,(CHARINDEX(' ',LTRIM(@test) + ' ')-1))
Run Code Online (Sandbox Code Playgroud)


小智 6

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

SET @Value = LTRIM(RTRIM(@Value))
Run Code Online (Sandbox Code Playgroud)


小智 5

马克的回答让我得到了我所需要的大部分信息,但我不得不接受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
Run Code Online (Sandbox Code Playgroud)

结果...

race_id  race_description           race_abbreviation
-------  -------------------------  -----------------
1        White                      White
2        Black or African American  Black
3        Hispanic/Latino            Hispanic
Run Code Online (Sandbox Code Playgroud)

注意:这是一个小数据集(美国联邦种族报告类别);我不知道当扩大到大量时性能会发生什么变化。