-1

我的 SQL Server 列之一存储了元组。

我只想Room_ID从列中提取一个Module_ref列及其值。

例子:

module_ref
{"ID": 1, "Room_ID": "111,222", "Test_ID":"9"}
{"ID": 1, "Room_ID": "111", "Test_ID":"9"}
{"ID": 1, "Room_ID": "None", "Test_ID":"9"}
{"ID": 1, "Room_ID": "111,222,333", "Test_ID":"9"}

预期产出

Room_ID
------------
111,222
111
None
111,222,333
4

2 回答 2

2

这是一个NON JSON使用charindex()&的解决方案substring()

select substring(data_col, 1, charindex('"', data_col)-1) as Room_ID
from table cross apply
     ( values (charindex('Room_ID', t.col) + 11) 
     ) tt(char_index) cross apply
     ( values (substring(t.col, tt.char_index, len(t.col))) 
     ) ttt(data_col);
于 2019-06-10T15:47:56.457 回答
2

如果您使用的是SQL Server 2016+,那么正如我所提到的,请使用OPENJSON

SELECT OJ.RoomID
FROM (VALUES('{"ID": 1, "Room_ID": "111,222", "Test_ID":"9"}'),
            ('{"ID": 1, "Room_ID": "111", "Test_ID":"9"}'),
            ('{"ID": 1, "Room_ID": "None", "Test_ID":"9"}'),
            ('{"ID": 1, "Room_ID": "111,222,333", "Test_ID":"9"}'))V(JSON)
     CROSS APPLY OPENJSON(V.JSON) 
                 WITH (ID int '$.ID',
                       RoomID varchar(500) '$.Room_ID',
                       TestID int '$.Test_ID') OJ;

理想情况下,之后,您应该使用字符串拆分器将数据更改为标准化值。

于 2019-06-10T15:50:36.947 回答