提取除最后一个单词之外的所有内容

Extract all BUT the last word

我得到了以下成功提取字段中最后一个词的语句。

select right(rtrim([FIELDNAME]),charindex(' ',reverse(rtrim([FIELDNAME]))+' ')-1)

但是,有谁知道您可以提取所有内容直到最后一个字吗?

例如:

Joe Michael Bloggs 会变成“Bloggs”和“Joe Michael”

您可以使用 CROSS APPLY 计算一次位置。

例子

Declare @YourTable Table ([SomeCol] varchar(50))  Insert Into @YourTable Values 
 ('Joe Michael Bloggs')
,('Mary Smith')
,('Cher')
 
Select SomeCol
      ,LastWord = right(SomeCol,Pos)
      ,TheRest  = rtrim(left(SomeCol,len(SomeCol)-Pos))
 From  @YourTable A
 Cross Apply ( values (charindex(' ',reverse(SomeCol)+' ')-1) ) B(Pos)

结果

SomeCol             LastWord    TheRest
Joe Michael Bloggs  Bloggs      Joe Michael
Mary Smith          Smith       Mary
Cher                Cher    

另一种基于XQuery 的方法。它的数据模型基于有序序列。这使得通过 last() 或任何其他令牌获取最后一个令牌变得非常容易。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE(ID INT IDENTITY PRIMARY KEY, tokens NVARCHAR(MAX));
INSERT INTO @tbl (tokens) VALUES
('Joe Michael Bloggs'),
('Mary Smith'),
('Marie Odette Rose Bellino'),
('Cher');
-- DDL and sample data population, end

SELECT ID, tokens
      , c.query('data(/root/r[position() lt last()])').value('text()[1]', 'NVARCHAR(200)') AS [LeadingTokens]
      , c.value('(/root/r[last()]/text())[1]', 'NVARCHAR(20)') AS [LastToken]
FROM @tbl
    CROSS APPLY (SELECT TRY_CAST('<root><r><![CDATA[' + 
        REPLACE(tokens, SPACE(1), ']]></r><r><![CDATA[') + 
        ']]></r></root>' AS XML)) AS t(c);

输出

+----+---------------------------+-------------------+-----------+
| ID |          tokens           |   LeadingTokens   | LastToken |
+----+---------------------------+-------------------+-----------+
|  1 | Joe Michael Bloggs        | Joe Michael       | Bloggs    |
|  2 | Mary Smith                | Mary              | Smith     |
|  3 | Marie Odette Rose Bellino | Marie Odette Rose | Bellino   |
|  4 | Cher                      | NULL              | Cher      |
+----+---------------------------+-------------------+-----------+