Разверните строку с помощью массива JSON внутри столбца до нескольких строк - PullRequest
2 голосов
/ 03 мая 2019

Я столкнулся с проблемой SQL-Data-Migration (SQL Server), и я надеюсь, вы можете направить меня в правильном направлении.

Предположим, у нас есть таблица DataTable (имена упрощены) со следующими столбцами:

DataID | SomeForeignKey | SpecificDataValues | OtherSpecificDataValues
int    | int            | String             | String
-------+----------------+--------------------+------------------------
0      | 1              | ['1','2']          | ['1', '2']

, где SpecificDataValues и OtherSpecificDataValues - массивы JSON (например, ['1', '2'])

Теперь я хочу перенести эту таблицу (в лучшем случае с помощью сценария миграции SQL) в новую таблицу:

DataValuesTable
DataID | SomeForeignKey | SpecificDataValues | OtherSpecificDataValues
-------+----------------+--------------------+------------------------
0      | 1              | 1                  | 1
1      | 1              | 2                  | 2

Итак, я в основном хочу создать новую строку в новой таблице для каждого значения, хранящегося в «SpecificDataValues» и «OtherSpecificDataValues»

Я уже проверил, что есть функции SQL для работы с JSON (OPENJSON, JSON_QUERY), но я не смог получить желаемый результат с помощью этих инструментов.

Надеюсь, вы можете показать мне правильное направление.

1 Ответ

3 голосов
/ 03 мая 2019

Одним из решений является использование OPENJSON дважды. Он сгенерирует Array (2) x Array (2) = 4 строки, те, в которых вы заинтересованы, совпадают с позициями индекса:

SELECT DataID, SomeForeignKey, j1.value, j2.value
FROM t
CROSS APPLY OPENJSON(SpecificDataValues) AS j1
CROSS APPLY OPENJSON(OtherSpecificDataValues) AS j2
WHERE j1.[key] = j2.[key]

Другим решением является совместное использование OPENJSON и JSON_VALUE:

SELECT DataID, SomeForeignKey, j1.value, JSON_VALUE(OtherSpecificDataValues, CONCAT('$[', CAST(j1.[key] AS INT), ']'))
FROM t
CROSS APPLY OPENJSON(SpecificDataValues) AS j1

Обратите внимание, что ваш "JSON" недействителен. Строки должны быть заключены внутри ".

Демонстрация по дб <> fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...