Как добавить данные в объект JSON во время выбора? - PullRequest
0 голосов
/ 10 сентября 2018

Я в процессе миграции данных из старой системы. У меня есть несколько логических столбцов, которые могут быть True, False или Null. Каждый столбец имеет определенное значение. В новой базе данных я использую объект данных JSON. Чего я хотел бы добиться, так это:

OldTable:
ValueA, ValueB, ValueC, ValueD
Null  , True  , False , True

Теперь я создаю данные Json, используя select на моей старой таблице и FOR JSON, чтобы получить объект Json. Объект должен выглядеть примерно так:

{
     myObject: {
           data: "valueB, ValueD"
     }
}

Моя проблема заключается в добавлении значений в одно и то же поле данных.

Так что сейчас я могу сделать это только с такими значениями, как это:

SELECT CASE WHEN ValueA == True THEN 'ValueA' END 'myObject.data',
       CASE WHEN ValueB == True THEN 'ValueB' END 'myObject.data'  
FROM myLegacyTable FOR JSON Path

Это, очевидно, перезапишет то, что всегда в myObject.data, всякий раз, когда оба значения верны. JSON_MODIFY, кажется, не вариант, так как я не работаю над существующим объектом Json, а создаю новый. Может быть, у кого-то еще есть идея?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Вы можете просто построить строку json с помощью CASE WHEN. Если вы хотите обрабатывать переменное число столбцов, вам, вероятно, понадобится динамический TSQL.

Это простая статическая версия, которая должна выполнять эту работу:

declare @tmp table(ValueA bit, ValueB bit, ValueC bit, ValueD bit)
insert into @tmp values (null, 1 ,0 , 1)

SELECT JSON_QUERY('{"data":"' + 
stuff(
      case when ValueA = 1 then  ',ValueA'  else '' end 
    + case when ValueB = 1 then  ',ValueB'  else '' end 
    + case when ValueC = 1 then  ',ValueC'  else '' end 
    + case when ValueD = 1 then  ',ValueD'  else '' end 
    ,1,1,'') 
    + '"}') as myObject
FROM @tmp FOR JSON Path, without_array_wrapper

Результат:

enter image description here

0 голосов
/ 11 сентября 2018

Я не знаю, как на самом деле хранятся ваши исходные данные, но вот пример того, что вам нужно сделать, если все это было в SQL Server

data.property не является отдельным элементом, поэтому не разбивайте его на столбцы. Это просто одна объединенная строка. Так что объедините все и удалите запятую.

DECLARE @MyTable TABLE (
RowID INT,
ValueA VARCHAR(5),
ValueB VARCHAR(5),
ValueC VARCHAR(5),
ValueD VARCHAR(5)
)

INSERT INTO @MyTable (RowID,ValueA,ValueB,ValueC,ValueD) VALUES 
(1,NULL,'True','False','True'),
(2,'False',NULL,'True','True'),
(3,NULL,'False',NULL,NULL)

SELECT 
ISNULL(
RTRIM(REVERSE(STUFF(REVERSE
(
CASE WHEN ValueA='True' THEN 'ValueA, ' ELSE '' END +
CASE WHEN ValueB='True' THEN 'ValueB, ' ELSE '' END +
CASE WHEN ValueC='True' THEN 'ValueC, ' ELSE '' END +
CASE WHEN ValueD='True' THEN 'ValueD, ' ELSE '' END
), 2, 1, ''))),'') AS 'myObject.data'
FROM @MyTable
FOR JSON Path

Огромная конструкция, необходимая для удаления трейлинга ,, отсюда:

Удалить последний символ в строке в T-SQL?

Результат:

[
    {
        "myObject": {
            "data": "ValueB, ValueD"
        }
    },
    {
        "myObject": {
            "data": "ValueC, ValueD"
        }
    },
    {
        "myObject": {
            "data": ""
        }
    }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...