sql-server - 使用交叉应用的 SQL Server 字符串拆分返回错误
问题描述
我在 select 语句中使用以下内容在 ; 上拆分字符串 delimiter 当字段中实际上没有数据或没有分隔符时查询错误,我该如何在这里进行错误控制
select ParsedData.*
from Table1
cross apply ( select str = field + ';;' ) f1
cross apply ( select p1 = charindex( ';', str ) ) ap1
cross apply ( select p2 = charindex( ';', str, p1 + 1 ) ) ap2
cross apply ( select p3 = CHARINDEX(';', str, p2 + 1 )) ap3
cross apply ( select p4 = CHARINDEX(';', str, p3 + 1 )) ap4
cross apply ( select p5 = CHARINDEX(';', str, p4 + 1 )) ap5
cross apply ( select p6 = CHARINDEX(';', str, p5 + 1 )) ap6
cross apply ( select A = substring( str, 1, p1-1 )
,B = substring( str, p1+1, p2-p1-1 )
,C = SUBSTRING( str, p2+1 , p3-p2-1)
,D = SUBSTRING( str, p3+1 , p4-p3-1)
,E = SUBSTRING( str, p4+1 , p5-p4-1)
,F = SUBSTRING( str, p5+1 , p6-p5-1)
) ParsedData
返回错误 - 传递给 LEFT 或 SUBSTRING 函数的长度参数无效。
输入
全串
apple;mango;cherry;jam;cake
输出
ABCDE
苹果芒果樱桃果酱蛋糕
谢谢
解决方案
您可以尝试添加 where 子句来排除这些数据。但是,根据查询计划,表达式可能会被评估(在应用 where 之前)
select ParsedData.*
from Table1
cross apply ( select str = field + ';;' ) f1
cross apply ( select p1 = charindex( ';', str ) ) ap1
cross apply ( select p2 = charindex( ';', str, p1 + 1 ) ) ap2
cross apply ( select p3 = CHARINDEX(';', str, p2 + 1 )) ap3
cross apply ( select p4 = CHARINDEX(';', str, p3 + 1 )) ap4
cross apply ( select p5 = CHARINDEX(';', str, p4 + 1 )) ap5
cross apply ( select p6 = CHARINDEX(';', str, p5 + 1 )) ap6
cross apply ( select A = substring( str, 1, p1-1 )
,B = substring( str, p1+1, p2-p1-1 )
,C = SUBSTRING( str, p2+1 , p3-p2-1)
,D = SUBSTRING( str, p3+1 , p4-p3-1)
,E = SUBSTRING( str, p4+1 , p5-p4-1)
,F = SUBSTRING( str, p5+1 , p6-p5-1)
) ParsedData
where str like '%;%;%;%;%'
但是请记住,在 SQL 2016 中,您可以使用它string_split
来执行此操作。
https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql?view=sql-server-2017
推荐阅读
- css - 如何将分页保持在固定位置?
- java - 导入 com.androdocs.httprequest.HttpRequest 中的 Android Studio 错误
- android - requestPermissions() 没有响应,当我单击按钮时没有任何反应
- ios - Firebase 在 iOs pod 上颤振时出错
- symfony - Doctrine 不会在我的 OneToMany 关联中保存数据
- python - Cloudwatch 原始 json 到 python 中的 JSON 提取
- linux - LINUX CP:我需要将所有文件从一个目录复制到另一个目录而不复制任何子目录
- flutter - Flutter - 使列/小部件可变宽度与其他固定?
- apache-flink - 当我尝试读取 kafka 表单时,Flink 抛出 NOSUCHMETHOD ERROR
- java - 使用 Apache PDFBox 创建 PDF 时访问权限无法正常工作