按空格正确拆分字符串列
splitting a string column correctly by spaces
在我的查询中,我有数百条记录,其中包含来自 iSeries 消息队列的字符串,如下所示:
006 1 AccountSetBalance 0000000000 EQ 2016-03-01-18.45.42.002000 0038882665 _ 123456 12345612345678 17017362 0 0
我需要在结果中显示帐号部分 12345678
和余额部分 17017362
我试过:
SELECT MQ_Message
, SUBSTRING(MQ_Message,92,30) -- = 12345678 17017362 0
, SUBSTRING(MQ_Message,92,8) -- = 12345678 , SUBSTRING(MQ_Message,100, CHarIndex(' ', SUBSTRING('006 1 AccountSetBalance 0000000000 EQ 2016-03-01-18.45.42.002000 0038882665 _ 123456 12345612345678 17017362 0 0',92,20)) )
, CHarIndex(' ', SUBSTRING('006 1 AccountSetBalance 0000000000 EQ 2016-03-01-18.45.42.002000 0038882665 _ 123456 12345612345678 17017362 0 0',99,20))
, CHARINDEX(' ','17017362 0 0')
from outboundMessages WHERE message_Type = '006'
我可以很容易地得到账户,因为字符串的长度是固定的,直到余额,但是我需要拆分 SUBSTRING(MQ_Message,92,30)
返回的字符串并从中取出余额部分,即 17017362
并且在 0 和 999999 之间会有所不同(以便士为单位!)
我真的很难找到平衡,尝试了使用 CHARINDEX 的所有可能组合。
最好的方法是什么?
DECLARE @string NVARCHAR(MAX) = '006 1 AccountSetBalance 0000000000 EQ 2016-03-01-18.45.42.002000 0038882665 _ 123456 12345612345678 17017362 0 0',
@xml xml
select @xml = cast('<d><q>'+REPLACE(@string,' ','</q><q>')+'</q></d>' as xml)
SELECT n.v.value('q[9]','integer'),
n.v.value('q[11]','integer')
FROM @xml.nodes('/d') AS n(v);
结果:
----------- -----------
123456 17017362
(1 row(s) affected)
在我的查询中,我有数百条记录,其中包含来自 iSeries 消息队列的字符串,如下所示:
006 1 AccountSetBalance 0000000000 EQ 2016-03-01-18.45.42.002000 0038882665 _ 123456 12345612345678 17017362 0 0
我需要在结果中显示帐号部分 12345678
和余额部分 17017362
我试过:
SELECT MQ_Message
, SUBSTRING(MQ_Message,92,30) -- = 12345678 17017362 0
, SUBSTRING(MQ_Message,92,8) -- = 12345678 , SUBSTRING(MQ_Message,100, CHarIndex(' ', SUBSTRING('006 1 AccountSetBalance 0000000000 EQ 2016-03-01-18.45.42.002000 0038882665 _ 123456 12345612345678 17017362 0 0',92,20)) )
, CHarIndex(' ', SUBSTRING('006 1 AccountSetBalance 0000000000 EQ 2016-03-01-18.45.42.002000 0038882665 _ 123456 12345612345678 17017362 0 0',99,20))
, CHARINDEX(' ','17017362 0 0')
from outboundMessages WHERE message_Type = '006'
我可以很容易地得到账户,因为字符串的长度是固定的,直到余额,但是我需要拆分 SUBSTRING(MQ_Message,92,30)
返回的字符串并从中取出余额部分,即 17017362
并且在 0 和 999999 之间会有所不同(以便士为单位!)
我真的很难找到平衡,尝试了使用 CHARINDEX 的所有可能组合。
最好的方法是什么?
DECLARE @string NVARCHAR(MAX) = '006 1 AccountSetBalance 0000000000 EQ 2016-03-01-18.45.42.002000 0038882665 _ 123456 12345612345678 17017362 0 0',
@xml xml
select @xml = cast('<d><q>'+REPLACE(@string,' ','</q><q>')+'</q></d>' as xml)
SELECT n.v.value('q[9]','integer'),
n.v.value('q[11]','integer')
FROM @xml.nodes('/d') AS n(v);
结果:
----------- -----------
123456 17017362
(1 row(s) affected)