SQL Server: извлечение данных столбца - PullRequest
0 голосов
/ 10 июня 2019

В одном из моих столбцов 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

Ответы [ 2 ]

2 голосов
/ 10 июня 2019

Если вы используете 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;

В идеале после этого вам следует использовать строкусплиттер, чтобы изменить ваши данные на нормализованное значение.

2 голосов
/ 10 июня 2019

Вот решение 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...