2017-05-03 69 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