【问题标题】:Extract all BUT the last word提取所有但最后一个词
【发布时间】:2021-09-08 10:36:34
【问题描述】:

我有以下语句成功提取字段中的最后一个单词。

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

但是,有谁知道您可以提取到最后一个单词的所有内容?

例如:

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

【问题讨论】:

  • 根据问题指南,请展示您尝试过的内容并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。你肯定玩过类似的逻辑,它只是substring(0,index) 而不是substring(index,end)
  • 类似:substring([FIELDNAME]), 1, len(reverse(rtrim([FIELDNAME])) - charindex(' ',reverse(rtrim([FIELDNAME]))))

标签: sql sql-server tsql sql-server-2016


【解决方案1】:

您可以使用 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    

【讨论】:

    【解决方案2】:

    另一种基于 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      |
    +----+---------------------------+-------------------+-----------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多