sql-server 从表中的字符串获取最后一个单词

4dc9hkyq  于 2022-10-31  发布在  其他
关注(0)|答案(4)|浏览(286)

我正在尝试从SQL-Server 2017中的表Project获取最后一个字。
我的代码如下:

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

如果我要求将表隔离到一行,那么代码就可以工作,但是我需要字段ProjectDescription中所有行的最后一个字。
当我运行上面的代码时,我得到了以下错误:
传递给LEFT或SUBSTRING函数的长度参数无效。
请有人能帮助我,我在哪里出错。

eaf3rand

eaf3rand1#

迟交的答复,仅作为指导发布。

不需要拆分字符串。您的错误仅仅是因为charindex()返回了零。简单的修复方法是在charindex()中添加一个“fail-safe”,方法是在字符串中添加一个空格,从而确保命中。
此外,请注意Sean的建议。几年前我也有一个类似的分割功能,对性能的提高感到惊讶。

示例

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
xqnpmsa8

xqnpmsa82#

我使用一个表值函数的组合来将列表拆分成一个有序列表。然后使用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

这是设置好的,所以我有一张table要用。你会把这个分出来作为你的table。

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
knpiaxh1

knpiaxh13#

您可以使用以下简单函数:

create function dbo.getLastWord(@s varchar(100))
returns varchar(200)
as
begin
declare @i int
set @i=len(@s)
 while substring(@s,@i,1)<>' '
  set @i=@i-1
 return substring(@s,@i,len(@s)-@i+1)
end

并称之为:

select dbo.getLastWord('Feels things getting better')

其得到:

better
flvtvl50

flvtvl504#

这是我想出的最简单的办法:

SELECT Reverse(JSON_VALUE('["' + REPLACE(Reverse('1A.2b.33C.44D4.55E'),'.','","') + '"]','$[0]'))

相关问题