[英]SQL Server 2019 query returns all null values when trying to separate a single column into multiples columns of data
I have a table of data that uses a /
as delimiter.我有一个使用
/
作为分隔符的数据表。 I'm trying to separate the single column of data into three columns.我正在尝试将单列数据分成三列。
My query is returning the proper number of rows, but all three columns are NULL.我的查询返回了正确的行数,但所有三列都是 NULL。 Does anything jump off the page as obvious that I've missed?
是否有任何我错过的明显内容跳出页面?
Here is how the data is stored in the PGroup
column:以下是数据在
PGroup
列中的存储方式:
Steve/Mouse/Vitamin
Matt/Cat/Soda
Shelly/Dog/Bread
I'm hoping to return 3 separate columns: Name, Pet, Food
我希望返回 3 个单独的列:
Name, Pet, Food
DECLARE @delimiter VARCHAR(50)
SET @delimiter='/'
;WITH CTE AS
(
SELECT
CAST('' + REPLACE([PGroup], @delimiter, '') + '' AS XML) AS [PXML]
FROM
xx123
)
SELECT
[PXML].value('/M[1]', 'varchar(50)') As [Name],
[PXML].value('/M[2]', 'varchar(50)') As [Pet],
[PXML].value('/M[3]', 'varchar(50)') As [Food]
FROM
CTE
Please try the following solution.请尝试以下解决方案。
Notable points:值得注意的点:
text()
for performance reasons.text()
。 SQL SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, tokens VARCHAR(1000));
INSERT INTO @tbl (tokens) VALUES
('Steve/Mouse/Vitamin'),
('Matt/Cat/Soda'),
('Shelly/Dog/Bread');
-- DDL and sample data population, end
DECLARE @separator CHAR(1) = '/';
SELECT ID
, c.value('(/root/r[1]/text())[1]', 'varchar(50)') As [Name]
, c.value('(/root/r[2]/text())[1]', 'varchar(50)') As [Pet]
, c.value('(/root/r[3]/text())[1]', 'varchar(50)') As [Food]
FROM @tbl
CROSS APPLY (SELECT TRY_CAST('<root><r><![CDATA[' +
REPLACE(tokens, @separator, ']]></r><r><![CDATA[') +
']]></r></root>' AS XML)) AS t(c);
Output Output
+----+--------+-------+---------+
| ID | Name | Pet | Food |
+----+--------+-------+---------+
| 1 | Steve | Mouse | Vitamin |
| 2 | Matt | Cat | Soda |
| 3 | Shelly | Dog | Bread |
+----+--------+-------+---------+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.