【发布时间】:2016-11-28 19:44:04
【问题描述】:
以表为:
Name Num Value
----------------------
Peter 10 10
Mary 10,15 5,10
John 5,20 10,20
如何通过 View 获得如下表的结果?
Name Num Value
------------------
Peter 10 10
Mary 10 5
Mary 15 10
John 5 10
John 20 20
注意 Mary 和 John 有多个数据(逗号分隔)。
我有一个函数可以拆分单元格并返回一个表格,但仅针对特定的行和单元格,可以从所有表格中迭代?
附加信息:
SELECT NAM.NAME, Data AS NUM, VAL.VALUE
FROM dbo.Split((SELECT NUM FROM t1 WHERE LineNum = 2), ','))
CROSS APPLY (
SELECT Id As Id1, Data AS VALUE
FROM dbo.Split((SELECT VALUE FROM t1 WHERE LineNum = 2), ','))
) AS VAL
CROSS APPLY (
SELECT NAME FROM t1 WHERE LineNum = 2
) AS NAM
WHERE Id = Id1
注意:LineNum 是从 t1 开始的行号
从 t1 的第二行(玛丽 | 10,15 | 5,10)
上一个函数返回表为:
Name Num Value
------------------
Mary 10 5
Mary 15 10
从单元格 (10,15) 中拆分函数返回:
Id Data
-----------
1 10
2 15
================================================
我的拆分函数:
CREATE FUNCTION [dbo].[Split]
(
@String NVARCHAR(4000),
@Delimiter NCHAR(1)
)
RETURNS TABLE
AS
RETURN
(
WITH Split(stpos,endpos)
AS(
SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
UNION ALL
SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
FROM Split
WHERE endpos > 0
)
SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
FROM Split
)
【问题讨论】:
-
你给我们展示一下你的分割函数怎么样?根据您使用的分离器,这可能是不可能的。当然这也引出了一个问题……你能改变你的系统并停止存储这样的分隔值吗?这确实是一种处理数据的糟糕方式。
-
您好,我无法更改原始数据(分隔值单元格)
-
但是你的分割函数在哪里呢?那是可能使这不起作用的部分。您将需要每个元素的序号位置,以便确保每个 num 和值都正确匹配。
-
我的拆分功能:
标签: sql-server