以下是我正在使用的数据。我使用的是Jaspersoft Studio版本6.3和SQL Server 2012.我的问题是如何使用SQL代码将具有可变长度字符串的单元格拆分为多个具有可变长度的子字符串?
示例:
这是字符串
'MEM - CP NEW INSTALL - 000 - 519.83 - MEMPHIS - SHELBY - TN'
这是我想要的输出:
MEM
CP NEW INSTALL
000
519.83
MEMPHIS
SHELBY
TN
每个都在一个单独的栏目中。
每个都有可变长度,我正在尝试为导入的数据制作通用代码
答案 0 :(得分:1)
也许就是这样。
Declare @String varchar(max) = 'MEM - CP NEW INSTALL - 000 - 519.83 - MEMPHIS - SHELBY - TN'
Select * from [dbo].[udf-Str-Parse-Row](@String,' - ')
返回
Pos1 Pos2 Pos3 Pos4 Pos5 Pos6 Pos7 Pos8 Pos9
MEM CP NEW INSTALL 000 519.83 MEMPHIS SHELBY TN NULL NULL
UDF - 足以根据您的需求/尺寸进行定制
CREATE FUNCTION [dbo].[udf-Str-Parse-Row] (@String varchar(max),@Delimeter varchar(10))
--Usage: Select * from [dbo].[udf-Str-Parse-Row]('Dog,Cat,House,Car',',')
-- Select * from [dbo].[udf-Str-Parse-Row]('John Cappelletti',' ')
-- Select * from [dbo].[udf-Str-Parse-Row]('id26,id46|id658,id967','|')
Returns Table
As
Return (
SELECT Pos1 = xDim.value('/x[1]','varchar(250)')
,Pos2 = xDim.value('/x[2]','varchar(250)')
,Pos3 = xDim.value('/x[3]','varchar(250)')
,Pos4 = xDim.value('/x[4]','varchar(250)')
,Pos5 = xDim.value('/x[5]','varchar(250)')
,Pos6 = xDim.value('/x[6]','varchar(250)')
,Pos7 = xDim.value('/x[7]','varchar(250)')
,Pos8 = xDim.value('/x[8]','varchar(250)')
,Pos9 = xDim.value('/x[9]','varchar(250)')
FROM (Select Cast('<x>' + Replace(@String,@Delimeter,'</x><x>')+'</x>' as XML) as xDim) A
)
另一个选项是标准解析(使用行nr),然后您可以根据需要进行调整
Select * from [dbo].[udf-Str-Parse](@String,' - ')
返回
Key_PS Key_Value
1 MEM
2 CP NEW INSTALL
3 000
4 519.83
5 MEMPHIS
6 SHELBY
7 TN
第二个UDF
CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimeter varchar(10))
--Usage: Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',')
-- Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')
Returns @ReturnTable Table (Key_PS int IDENTITY(1,1), Key_Value varchar(max))
As
Begin
Declare @XML xml;Set @XML = Cast('<x>' + Replace(@String,@Delimeter,'</x><x>')+'</x>' as XML)
Insert Into @ReturnTable Select Key_Value = ltrim(rtrim(String.value('.', 'varchar(max)'))) FROM @XML.nodes('x') as T(String)
Return
End