sql – 使用CTE进行字符串拆分的有效方法
发布时间:2020-05-23 23:07:13 所属栏目:MsSql 来源:互联网
导读:我有一张看起来像的桌子 ID Layout1 hello,world,welcome,to,tsql2 welcome,to,stackoverflow 期望的输出应该是 Id Splitdata1 hello1 world1 welcome1 to1 tsql2 welcome2 to2 stackoverflow 我已通过以下查询
|
我有一张看起来像的桌子 ID Layout 1 hello,world,welcome,to,tsql 2 welcome,stackoverflow 期望的输出应该是 Id Splitdata 1 hello 1 world 1 welcome 1 to 1 tsql 2 welcome 2 to 2 stackoverflow 我已通过以下查询完成此操作 Declare @t TABLE(
ID INT IDENTITY PRIMARY KEY,Layout VARCHAR(MAX)
)
INSERT INTO @t(Layout)
SELECT 'hello,tsql' union all
SELECT 'welcome,stackoverflow'
--SELECT * FROM @t
;With cte AS(
select F1.id,O.splitdata
from
(
select *,cast('<X>'+replace(F.Layout,','</X><X>')+'</X>' as XML) as xmlfilter
from @t F
)F1
cross apply
(
select fdata.D.value('.','varchar(MAX)') as splitdata
from f1.xmlfilter.nodes('X') as fdata(D)) O
)
select * from cte
但表现明智,这是非常糟糕的.我正在寻找一个更有效的查询,但只使用CTE. 请帮忙 谢谢 解决方法你似乎已经开始使用CTE了,所以试试这个:DECLARE @YourTable table (RowID int,Layout varchar(200))
INSERT @YourTable VALUES (1,'hello,tsql')
INSERT @YourTable VALUES (2,'welcome,stackoverflow')
;WITH SplitSting AS
(
SELECT
RowID,LEFT(Layout,CHARINDEX(',Layout)-1) AS Part,RIGHT(Layout,LEN(Layout)-CHARINDEX(',Layout)) AS Remainder
FROM @YourTable
WHERE Layout IS NOT NULL AND CHARINDEX(',Layout)>0
UNION ALL
SELECT
RowID,LEFT(Remainder,Remainder)-1),RIGHT(Remainder,LEN(Remainder)-CHARINDEX(',Remainder))
FROM SplitSting
WHERE Remainder IS NOT NULL AND CHARINDEX(',Remainder)>0
UNION ALL
SELECT
RowID,Remainder,null
FROM SplitSting
WHERE Remainder IS NOT NULL AND CHARINDEX(',Remainder)=0
)
SELECT * FROM SplitSting ORDER BY RowID
OUTPUT: RowID Part ----------- ----------------------- 1 hello 1 world 1 welcome 1 to 1 tsql 2 welcome 2 to 2 stackoverflow (8 row(s) affected) 这是一篇关于在SQL Server中分割字符串的优秀文章:“Arrays and Lists in SQL Server 2005 and Beyond,When Table Value Parameters Do Not Cut it” by Erland Sommarskog 编辑这里的另一个版本(但你需要一个数字表)返回与上面相同的结果: ;WITH SplitValues AS
(
SELECT
RowID,ListValue
FROM (SELECT
RowID,LTRIM(RTRIM(SUBSTRING(List2,number+1,List2,number+1)-number - 1))) AS ListValue
FROM (
SELECT RowID,' + Layout + ',' AS List2
FROM @YourTable
) AS dt
INNER JOIN Numbers n ON n.Number < LEN(dt.List2)
WHERE SUBSTRING(List2,number,1) = ','
) dt2
WHERE ListValue IS NOT NULL AND ListValue!=''
)
SELECT * FROM SplitValues
请看这里的数字表:What is the best way to create and populate a numbers table? (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- sql-server – 尝试运行sqlcmd失败,无法建立连接?
- mysql创建Bitmap_Join_Indexes中的约束与索引
- sql-server – 使用SSIS,如何找到人口最多的城市?
- sql – 关系代数中的“θjoin”的清楚解释?
- sql-server – SQL Server查询结果末尾的空白空间
- sql – 使用RedShift CURSOR插入和迭代
- sql-server – UPDATE错误:“参数数据类型文本对REPLACE的
- 显示 Sql Server 中所有表中的信息
- 如何在SQL表中重命名列?
- CentOS 7.2.1511 编译安装Nginx1.10.1+MySQL5.7.14+PHP7.0.
