首页 > 解决方案 > 使用交叉应用的 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

苹果芒果樱桃果酱蛋糕

谢谢

标签: sql-serversql-server-2016

解决方案


您可以尝试添加 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


推荐阅读