使用 SQL Server
我有这个:
我想要这个:
有人知道怎么做吗?
请尝试以下方法。它基于 XML 和 XQuery 的使用。
XML 和 XQuery 数据模型基于有序序列。这就是为什么很容易获得序列中任何项目的位置的原因:第一个、最后一个等。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, Street VARCHAR(100));
INSERT INTO @tbl (Street) VALUES
('SANDISLE DR.'),
('TAMMY LANE'),
('OLD OREGON TRAIL'),
('ELTEDA'),
('PAROCAR ROAD');
-- DDL and sample data population, end
DECLARE @separator CHAR(1) = SPACE(1);
;WITH rs AS
(
SELECT *
, TRY_CAST('<root><r><![CDATA[' +
REPLACE(Street, @separator, ']]></r><r><![CDATA[') +
']]></r></root>' AS XML) AS xmldata
FROM @tbl
)
SELECT ID, Street
, xmldata.query('if (count(/root/r) gt 1) then data(/root/r[position() ne last()])
else data(/root/r[1])').value('(.)', 'VARCHAR(100)') AS StreetName
, xmldata.query('if (count(/root/r) gt 1) then data(/root/r[last()])
else ()').value('(.)', 'VARCHAR(100)') AS StreetSuffix
FROM rs;
输出
+----+------------------+------------+--------------+
| ID | Street | StreetName | StreetSuffix |
+----+------------------+------------+--------------+
| 1 | SANDISLE DR. | SANDISLE | DR. |
| 2 | TAMMY LANE | TAMMY | LANE |
| 3 | OLD OREGON TRAIL | OLD OREGON | TRAIL |
| 4 | ELTEDA | ELTEDA | |
| 5 | PAROCAR ROAD | PAROCAR | ROAD |
+----+------------------+------------+--------------+