Получить последнее слово из строки в таблице - PullRequest
1 голос
/ 17 октября 2019

Я пытаюсь получить последнее слово из таблицы Project в SQL-Server 2017.

Мой код выглядит следующим образом:

select 
reverse(substring(reverse(ProjectDescription),1, charindex(' ', reverse(ProjectDescription)) -1)) as LastWord
from Project 

Код работает, если я прошу изолироватьтаблица до одной строки, но мне нужно последнее слово для всех строк в поле ProjectDescription.

Когда я запускаю код, как указано выше, я получаю следующую ошибку:

Недопустимый параметр длины передан в функцию LEFT или SUBSTRING.

Пожалуйста, кто-нибудь может мне помочь, если я ошибаюсь.

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Поздний ответ, опубликован только в качестве руководства.

Нет необходимости разбивать строку. Ваша ошибка была просто потому, что charindex () вернул ноль. Простое исправление заключается в добавлении « отказоустойчивого » в charindex () путем добавления пробела в строку, что обеспечивает попадание.

Кроме того,пожалуйста, обратите внимание на совет Шона. Несколько лет назад у меня была похожая функция разделения, и я был поражен приростом производительности.

Пример

Declare @YourTable Table ([ID] varchar(50),[ProjectDescription] varchar(50))  Insert Into @YourTable Values 
 (1,'Some Project Item or Description') -- Multiword strubg
,(2,'OneWord    ')                      -- One word with trailing blanks
,(3,NULL)                               -- A NULL value
,(4,'')                                 -- An Empty String

Select * 
      ,LastWord = right(rtrim([ProjectDescription]),charindex(' ',reverse(rtrim([ProjectDescription]))+' ')-1)
 From  @YourTable 

Возвращает

ID  ProjectDescription                  LastWord
1   Some Project Item or Description    Description
2   OneWord                             OneWord
3   NULL                                NULL
4       
1 голос
/ 17 октября 2019

Я использую комбинацию табличной функции, чтобы разбить список на упорядоченный список. И затем возьмите только последний, используя rownumber.

Вот функция. их там много.

create FUNCTION SplitString
(    
      @Input NVARCHAR(MAX),
      @Character CHAR(1)
)
RETURNS @Output TABLE (
       ct int
      ,Item NVARCHAR(1000)
)
AS
BEGIN
      DECLARE @StartIndex INT, @EndIndex INT,@ct int =0

      SET @StartIndex = 1
      IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character
      BEGIN
            SET @Input = @Input + @Character
      END

      WHILE CHARINDEX(@Character, @Input) > 0
      BEGIN
            SET @EndIndex = CHARINDEX(@Character, @Input)
            set @ct=@ct+1

            INSERT INTO @Output(Ct,Item)
            SELECT @ct,SUBSTRING(@Input, @StartIndex, @EndIndex - 1)

            SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input))
      END

      RETURN
END
GO

Это настроено, поэтому у меня есть таблица для использования. Вы должны добавить это для своей таблицы.

declare @t as table(sentence varchar(max))

insert into @t
values
('The brown dog jumped over the fence')
,('This is the final word')

Вот SQL для извлечения последнего слова:

select *
from (
        select * ,rn = ROW_NUMBER() over (partition by sentence order by ct desc)
        from @t t
            cross apply dbo.splitstring(t.sentence,' ')
    ) a
where rn=1

Результаты:

sentence                            ct  Item    rn
The brown dog jumped over the fence 7   fence   1
This is the final word              5   word    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...