SQL 提取字符串中最后一个单词的语句?

SQL statement to extract the last word in a string?

I 运行 SELECT 语句在 SQL Server 2016 中使用 CHARINDEX 到 return 字符串中的最后一个单词,使用 space 作为定界符。它适用于某些领域和其他领域,它会删除一些字符。有人可以给我指出正确的方向吗?

我已经尝试了 RIGHT、LEFT 和 REVERSE 内置函数以及 SUBSTRING 函数。

SELECT TRIM(RIGHT('XXxxx Xxxxxx x Xxxxxx Xxxxx Xxxx Xxxxxx 5 - Xxxxxx - Xxxxxx Xxxxxxx Xxxxxxxxxx Xxxxxxxxxx',CHARINDEX(' ','XXxxx Xxxxxx x Xxxxxx Xxxxx Xxxx Xxxxxx 5 - Xxxxxx - Xxxxxx Xxxxxxx Xxxxxxxxxx Xxxxxxxxxx',0)+1))

我期待最后一个词 - Xxxxxxxxxx 但是对于这个特定的记录,上面的查询 returns xxxxxxx 并忽略了前面的 3 个字符。对于其他一些记录,它有效并且 returns 甚至最多 8 个字符。如果指出正确的方向,我将不胜感激。

见下面的代码。思路是:

  1. 反转字符串。
  2. 反转后找到第一个space
  3. 获取 space
  4. 左侧的所有内容
  5. 再次反转它,因为字符串被反转了。

我不是直接给你答案,而是把它分解了,这样你可以更好地理解它

declare @something varchar(20) = '1234 5678 192'

select @something as original
  , reverse(@something) as reversed
  , charindex(' ',reverse(@something)) last_space_position
  , left(reverse(@something), charindex(' ',reverse(@something))) what_you_need_in_reverse
  , reverse(left(reverse(@something), charindex(' ',reverse(@something)))) what_you_need

这是一种提取值而不反转值本身的方法:

select stuff(@something,
             1,
             len(@something) - charindex(' ', reverse(@something) + ' ') + 1,
             '')

如果字符串没有空格,此公式也适用。