MS SQL Query JSON отображает нулевое значение - PullRequest
0 голосов
/ 08 мая 2020

У меня есть таблица PublicRelations со столбцом под названием Students в базе данных SQL Server под названием Subjects.

[
    { "Label": "Name",     "ColumnValue": "Trudie" },      
    { "Label": "Class",    "ColumnValue": "PublicRelations" },      
    { "Label": "Room",     "ColumnValue": "8049" },      
    { "Label": "HttpPath", "ColumnValue": "https://www.google.com/" }
]

Я получаю NULL только тогда, когда я запускаю запрос ниже, используя Json_value. Я бы хотел, чтобы он отображал значение из массива. Я считаю, что это может быть связано с ограничением в 4000 символов?

SELECT      [StuduentID], 
            [Students],
            --JSON_VALUE([Students],'$.ColumnValue') AS Name --Only returns NULL
FROM        [Subjects].[dbo].[PublicRelations] c
CROSS APPLY OPENJSON(c.Students)
  WITH (    Name int '$.Name',
            Value nvarchar(255) '$.ColmunValue'
  ) AS      jsonValues
WHERE       jsonValues.ColumnValue = 'Trudie'

Запрос работает, и я могу найти то, что мне нужно, но опять же, я получаю NULL только тогда, когда хочу отобразить эту часть столбец JSON в моих результатах.

1 Ответ

1 голос
/ 09 мая 2020

Заявление неверно, и у вас есть следующие проблемы (как уже упоминалось в @MartinSmith):

  • Синтаксическая ошибка - '$.ColmunValue' должно быть '$.ColumnValue'.
  • Неверная схема определение (предложение WITH) - я не вижу ключа Name во входных данных JSON.
  • Неправильное использование JSON_VALUE () - эта функция извлекает скалярное значение из строка JSON, поэтому JSON_VALUE([Students],'$.ColumnValue') возвращает NULL с этим JSON вводом в режиме lax.

Вы можете попробовать следующий оператор (на основе утверждения в вопросе ):

Таблица:

CREATE TABLE PublicRelations (
   StudentID int,
   Students nvarchar(1000))
INSERT INTO PublicRelations (StudentID, Students) 
VALUES (1, N'[
    { "Label": "Name",     "ColumnValue": "Trudie" },      
    { "Label": "Class",    "ColumnValue": "PublicRelations" },      
    { "Label": "Room",     "ColumnValue": "8049" },      
    { "Label": "HttpPath", "ColumnValue": "https://www.google.com/" }
]')

Заявление:

SELECT p.StudentID, j.*
FROM [PublicRelations] p
CROSS APPLY OPENJSON(p.Students) WITH (
   Name nvarchar(50) '$.Label',
   Value nvarchar(255) '$.ColumnValue'
) j
WHERE EXISTS (
   SELECT 1 
   FROM OPENJSON(p.Students) WITH (Value nvarchar(255) '$.ColumnValue')
   WHERE Value = N'Trudie'
) AND (j.Name IN ('Name', 'Class', 'Room'))

Результат:

StudentID   Name     Value
1           Name     Trudie
1           Class    PublicRelations
1           Room     8049
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...