提取除最后一个单词之外的所有内容
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 |
+----+---------------------------+-------------------+-----------+
我得到了以下成功提取字段中最后一个词的语句。
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 |
+----+---------------------------+-------------------+-----------+