Как я могу использовать значения JSON в качестве столбцов в запросе SQL? - PullRequest
0 голосов
/ 03 октября 2019

Я просто хочу получить данные json и использовать их поля в качестве столбца таблицы для других запросов.

Я пытаюсь преобразовать значение в ключе "nameProperty" в столбец таблицы,и значение ключей "newValue" заполняет строки этого столбца.

Например:

я получаю файл json, подобный этому

{ 
   "operation":{ 
      "ID":"ABC",
      "KinshipDescription":"--"
   },
   "fields":[ 
      { 
         "property":{ 
            "nameProperty":"ID",
            "oldValue":"",
            "newValue":"123456",
            "confirmed":"false",
            "labelProperty":"ID",
            "oldValueDescription":"",
            "newValueDescription":"123456"
         }
      },
      { 
         "property":{ 
            "nameProperty":"Name",
            "oldValue":"",
            "newValue":"John",
            "confirmed":"false",
            "labelProperty":"Name",
            "oldValueDescription":"",
            "newValueDescription":"John"
         }
      }
   ]
}

Я хочуизвлекать объекты из списка «полей», но я могу только сделать их строкой для ключа, а другую строку для значений, как в приведенном ниже сценарии.

DECLARE @jsonObj NVARCHAR(MAX)
--Set a result in 
SET @jsonObj = (select JSON_Query(data, '$.fields') from table where id = 'ABC')

select * from openjson(@jsonObj) 
with (Property nvarchar(255) '$.property.nameProperty',
 newValue nvarchar(50) '$.property.newValue') 

, и я понятия не имею, как я могу сделатьэто

результаты этого сценария выглядят примерно так

ID  123456
Name    John

и результаты, которые я хочу увидеть, это

ID      Name --column name, not a row
123456  John

1 Ответ

2 голосов
/ 04 октября 2019

Самый быстрый (вдумчивый, не обязательно производительный) способ, который я могу придумать, - это использование динамического SQL. На самом деле, я почти уверен, что вам придется его использовать.

Вот пример, который может заставить вас двигаться. Вы можете запустить это в SSMS.

DECLARE @json NVARCHAR(MAX) =
'{ 
   "operation":{ 
      "ID":"ABC",
      "KinshipDescription":"--"
   },
   "fields":[ 
      { 
         "property":{ 
            "nameProperty":"ID",
            "oldValue":"",
            "newValue":"123456",
            "confirmed":"false",
            "labelProperty":"ID",
            "oldValueDescription":"",
            "newValueDescription":"123456"
         }
      },
      { 
         "property":{ 
            "nameProperty":"Name",
            "oldValue":"",
            "newValue":"John",
            "confirmed":"false",
            "labelProperty":"Name",
            "oldValueDescription":"",
            "newValueDescription":"John"
         }
      }
   ]
}';

-- Variable to hold the column/values.
DECLARE @cols VARCHAR(MAX) = '';

-- Generate the column/value pairs.
SELECT 
    @cols = @cols
        + CASE WHEN ( LEN( @cols ) > 0 ) THEN ', ' ELSE '' END -- add comma if needed.
        + '''' + Properties.newValue + ''' AS [' + Properties.nameProperty + '] '
FROM OPENJSON( @json, '$.fields' ) WITH (
    property NVARCHAR(MAX) '$.property' AS JSON
)
CROSS APPLY (

    SELECT * FROM OPENJSON( property ) WITH (
        nameProperty VARCHAR(50) '$.nameProperty',
        oldValue     VARCHAR(50) '$.oldValue',
        newValue     VARCHAR(50) '$.newValue',
        confirmed    VARCHAR(50) '$.confirmed',
        labelProperty VARCHAR(50) '$.labelProperty',
        oldValueDescription VARCHAR(50) '$.oldValueDescription',
        newValueDescription VARCHAR(50) '$.newValueDescription'
    )

) AS Properties;

-- Execute column/value pairs as dynamic SQL.
EXEC ( 'SELECT ' + @cols );

Что возвращает:

+--------+------+
|   ID   | Name |
+--------+------+
| 123456 | John |
+--------+------+

Если бы вы были PRINT @cols, вы бы увидели

'123456' AS [ID] , 'John' AS [Name] 

Несколько быстрых заметок:

  • Производительность может отличаться.
  • Значения указаны в кавычках, но могут быть CAST , если необходимо.
  • Включены все поля 'свойства', например, в CROSS APPLY . Укажите только то, что нужно.
  • Обратите внимание на использование NVARCHAR при использовании AS JSON
  • Возможно, вы захотите рассмотреть OUTER APPLY , если есть потенциал для«собственности» нет.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...