假设我们有下表:
id name member
1 jacky a;b;c
2 jason e
3 kate i;j;k
4 alex null现在我想使用sql或t-sql返回下表:
1 jacky a
1 jacky b
1 jacky c
2 jason e
3 kate i
......如何做到这一点?我使用的是MSSQL、MYSQL和Oracle数据库。
发布于 2012-05-08 12:37:24
这是可以设计出的最短且可读的字符串到行的分割器,也可以是。
选择纯CTE代替function的用例,例如不允许在数据库上创建function :-)
通过函数创建行生成器(可以使用loop或via CTE实现)仍然需要使用横向联接(DB2和Sybase具有此功能,使用lateral关键字;在SQL Server中,这类似于CROSS APPLY和OUTER APPLY),以最终将函数生成的拆分行联接到主表。
纯CTE方法可能比函数方法更快。不过,速度指标在于性能分析,如果这确实比其他解决方案更快,那么只需检查它的执行计划:
with Pieces(theId, pn, start, stop) AS
(
SELECT id, 1, 1, charindex(';', member)
from tbl
UNION ALL
SELECT id, pn + 1, stop + 1, charindex(';', member, stop + 1)
from tbl
join pieces on pieces.theId = tbl.id
WHERE stop > 0
)
select
t.id, t.name,
word =
substring(t.member, p.start,
case WHEN stop > 0 THEN p.stop - p.start
ELSE 512
END)
from tbl t
join pieces p on p.theId = t.id
order by t.id, p.pn 输出:
ID NAME WORD
1 jacky a
1 jacky b
1 jacky c
2 jason e
3 kate i
3 kate j
3 kate k
4 alex (null)基础逻辑来源:T-SQL: Opposite to string concatenation - how to split string into multiple records
实时测试:http://www.sqlfiddle.com/#!3/2355d/1
https://stackoverflow.com/questions/10491784
复制相似问题