SQL JSON_VALUE выбирает родительские значения

#sql #json #sql-server

#sql #json #sql-сервер

Вопрос:

У меня есть этот JSON, и мне нужно извлечь 2 строки

  1. Дочерние элементы "properties" в столбце, разделенном запятыми.
  2. Дочерние элементы "title" в столбце, разделенном запятыми.

Результаты должны быть

  1.  BoxTp, boxNo
      
  2.  Box Type, Box Number
      
 {
    "$schema": "http://json-schema.org/draft-04/schema#",
    "properties": {
        "BoxTp": {
            "title": "Box Type",
            "type": [
                "null",
                "string"
            ],
            "description": "Type"
        },
        "boxNo": {
            "title": "Box Number",
            "type": [
                "integer",
                "null"
            ],
            "description": "Box No.",
            "format": "int32"
        }
    }
}
  

Комментарии:

1. Не могли бы вы, пожалуйста, поделиться примерами кодов?

Ответ №1:

Вам просто нужно проанализировать входной JSON и объединить результаты. Конечно, вам нужен SQL Server 2016 для использования встроенной поддержки JSON и SQL Server 2017 для агрегирования строк с STRING_AGG() :

 DECLARE @json nvarchar(max) = N'{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "properties": {
        "BoxTp": {
            "title": "Box Type",
            "type": [
                "null",
                "string"
            ],
            "description": "Type"
        },
        "boxNo": {
            "title": "Box Number",
            "type": [
                "integer",
                "null"
            ],
            "description": "Box No.",
            "format": "int32"
        }
    }
}'

SELECT STRING_AGG([key], ', ') AS ChildsOfProperties
FROM OPENJSON(@json, '$.properties')

SELECT STRING_AGG(j2.title, ', ') AS ChildsOfTitles
FROM OPENJSON(@json, '$.properties') j1
OUTER APPLY OPENJSON(j1.[value]) WITH (title nvarchar(100) '$.title') j2
  

Результат:

 ChildsOfProperties
-----------------
BoxTp, boxNo

ChildsOfTitles
--------------------
Box Type, Box Number
  

Если вам нужен один оператор:

 SELECT 
   STRING_AGG(j1.[key], ', ') AS ChildSOfProperties,
   STRING_AGG(j2.title, ', ') AS ChildSOfTitles
FROM OPENJSON(@json, '$.properties') j1
OUTER APPLY OPENJSON(j1.[value]) WITH (title nvarchar(100) '$.title') j2