2017-05-03 70 views
0

不同的列我怎样才能在列这一特定字符串分割为三个不同的列字符串分割到与SQL

样本:

Column_A 
---------- 
{"nationalCode":"1234567893","username":"123","ip":"::1"} 
{"nationalCode":"1234567892","username":"test","ip":"172.30.10.11"} 
{"nationalCode":"1234567890"} 
{"nationalCode":"1234567891","username":"test"} 

应该

nationalcode|username|Ip 
--------------------------- 
1234567893 |123  |::1 
1234567892 |test |172.30.10.11 
1234567890 |null |null 
1234567891 |test |null 

我迄今为止只有一个领域尝试过(我不知道如何解决它)

select SUBSTRING(REPLACE(SUBSTRING(ActionInput,CHARINDEX('nationalCode',ActionInput)+len('nationalCode":"'),CHARINDEX(',',ActionInput)),'""',''),0,11) as national1, 
     REPLACE(SUBSTRING(ActionInput,CHARINDEX('username',ActionInput)+len('username":"'),CHARINDEX(',',ActionInput)),'"}','') as a 

     from LogTBL 
+0

的SQL Server版本? – McNets

+0

@McNets sql-server-2008 –

+0

它总是这三个值的最大值,它们总是按照完全相同的顺序来进行吗?理想情况下,你绝对不应该存储这样的数据。这比xml更糟,违反了1NF。 –

回答

2

在这种情况下,你可以使用Replace通过VALUE()

DECLARE @SampleData AS TABLE 
(
    Column_A varchar(max) 
) 

INSERT INTO @SampleData 
VALUES 
('{"nationalCode":"1234567893","username":"123","ip":"::1"}'), 
('{"nationalCode":"1234567892","username":"test","ip":"172.30.10.11"}'), 
('{"nationalCode":"1234567890"}'), 
('{"nationalCode":"1234567891","username":"test"}') 

;WITH temp AS 
(
    SELECT CAST(REPLACE(replace(replace(replace(sd.Column_A, '":"', '="'), 
        '{"', '<x '),'}','></x>'), '","','" ') AS xml) AS XmlValue 
    FROM @SampleData sd 
) 
SELECT t.XmlValue.value('(/x/@nationalCode)[1]', 'varchar(30)') AS nationalCode, 
     t.XmlValue.value('(/x/@username)[1]', 'varchar(30)') AS username, 
     t.XmlValue.value('(/x/@ip)[1]', 'varchar(30)') AS ip 
FROM temp t 

演示链接改变Column_AXML并获得预期的数据:http://rextester.com/YEPUI94059

+0

不错的解决方案+1 –

+0

不错的代码,thx很多 –

+0

不客气,@E_N_Y – TriV