Извлечь первое слово строки в запросе SQL Server - PullRequest
33 голосов
/ 02 апреля 2009

Каков наилучший способ извлечь первое слово строки в запросе сервера sql?

Ответы [ 8 ]

64 голосов
/ 02 апреля 2009
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')
35 голосов
/ 13 апреля 2012

Я хотел сделать что-то подобное, не создавая отдельной функции, и предложил такой простой однострочный подход:

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

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

Это вернет результат "Первый"

Он короткий, но не такой надежный, поскольку предполагает, что ваша строка не начинается с пробела. Он будет обрабатывать вводы из одного слова, вводы из нескольких слов и вводы с пустой строкой или NULL.

5 голосов
/ 17 июня 2011

Добавление следующего перед оператором RETURN решит для случаев, когда в поле был включен начальный пробел:

SET @Value = LTRIM(RTRIM(@Value))
4 голосов
/ 04 сентября 2015

Улучшение ответа Бена Брандта на компенсацию, даже если строка начинается с пробела, применяя LTRIM (). Пытался отредактировать свой ответ, но отклонил его, поэтому сейчас я публикую его здесь отдельно.

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

SELECT SUBSTRING(LTRIM(@test),1,(CHARINDEX(' ',LTRIM(@test) + ' ')-1))
3 голосов
/ 03 ноября 2017
DECLARE @string NVARCHAR(50)

SET @string = 'CUT STRING'

SELECT LEFT(@string,(PATINDEX('% %',@string)))
3 голосов
/ 10 апреля 2012

Ответ Марка дал мне большую часть того, что мне было нужно, но мне пришлось идти с 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

Предостережение: это для небольшого набора данных (федеральные категории отчетов о гонках США); Я не знаю, что произойдет с производительностью, когда увеличится до огромных цифр.

1 голос
/ 14 сентября 2011
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) 

0 голосов
/ 24 марта 2013

Попробуйте:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...