Вложенный массив T-SQL OpenJson - PullRequest
1 голос
/ 12 марта 2019

Iam борется со следующей структурой JSOn

Declare @Json Nvarchar(max)
Set @Json = '
     {
  "entities": [
    {
      "Fields": [
        {
          "Name": "test-id",
          "values": [
            {
              "value": "1851"
            }
          ]
        },
        {
          "Name": "test-name",
          "values": [
            {
              "value": "01_DUMMY"
            }
          ]
        }


      ],
      "Type": "run",
      "children-count": 0
    },
    {
      "Fields": [
        {
          "Name": "test-id",
          "values": [
            {
              "value": "1852"
            }
          ]
        },
        {
          "Name": "test-name",
          "values": [
            {
              "value": "02_DUMMY"
            }
          ]
        }
      ],
      "Type": "run",
      "children-count": 0
    }
  ],
  "TotalResults": 2
}'

Мой вывод должен выглядеть следующим образом:

    test-id|test-name|Type|Children-count
    1851   |01_DUMMY |run |0
    1852   |02_DUMMY |run |0

Я пытался использовать примеры, опубликованные здесь, но ни один не соответствует моим потребностям.

Моим ближайшим помощником был этот синтаксис T-SQL

Select
*
From OPENJSON (@JSON,N'$.entities') E
CROSS APPLY OPENJSON (E.[value]) F 
CROSS APPLY OPENJSON (F.[value],'$') V where F.type = 4

Моей следующей идеей было использовать этот SQL-код для открытия следующего вложенного массива, но я всегда получаю сообщение об ошибке (

Ошибка поиска - ошибка базы данных SQL Server: неверный синтаксис рядом с Ключевое слово "КРЕСТ".

)

Select
*
From OPENJSON (@JSON,N'$.entities') E
CROSS APPLY OPENJSON (E.[value]) F 
CROSS APPLY OPENJSON (F.[value]) V where F.type = 4 
CROSS APPLY OPENJSON (V.[value]) N

Я не уверен, как добраться ближе к нужному мне выводу. Если честно, я только начал с T-SQL и никогда раньше не работал с JSON Files.

С уважением, Иоганн

1 Ответ

0 голосов
/ 12 марта 2019

Это довольно глубоко вложено.Я думаю, у вас есть правильная идея погружаться глубже и глубже, используя серию OPENJSON.Попробуйте вот так, чтобы получить свои значения:

Declare @Json Nvarchar(max)
Set @Json = '
     {
  "entities": [
    {
      "Fields": [
        {
          "Name": "test-id",
          "values": [
            {
              "value": "1851"
            }
          ]
        },
        {
          "Name": "test-name",
          "values": [
            {
              "value": "01_DUMMY"
            }
          ]
        }


      ],
      "Type": "run",
      "children-count": 0
    },
    {
      "Fields": [
        {
          "Name": "test-id",
          "values": [
            {
              "value": "1852"
            }
          ]
        },
        {
          "Name": "test-name",
          "values": [
            {
              "value": "02_DUMMY"
            }
          ]
        }
      ],
      "Type": "run",
      "children-count": 0
    }
  ],
  "TotalResults": 2
}';

- это запрос

WITH ReadJson AS
(
    SELECT A.TotalResults
          ,C.[Type]
          ,C.[children-count]
          ,D.[Name]
          ,E.*
    FROM OPENJSON(@Json) 
    WITH(TotalResults INT, entities NVARCHAR(MAX) AS JSON) A
    CROSS APPLY OPENJSON(A.entities) B
    CROSS APPLY OPENJSON(B.[value])
    WITH(Fields NVARCHAR(MAX) AS JSON,[Type] VARCHAR(100),[children-count] INT) C
    CROSS APPLY OPENJSON(C.Fields) 
    WITH([Name] VARCHAR(100),[values] NVARCHAR(MAX) AS JSON) D
    CROSS APPLY OPENJSON(D.[values]) 
    WITH([value] VARCHAR(100)) E
)
SELECT * FROM ReadJson;

Результат

+---+-----+---+-----------+----------+
| 2 | run | 0 | test-id   | 1851     |
+---+-----+---+-----------+----------+
| 2 | run | 0 | test-name | 01_DUMMY |
+---+-----+---+-----------+----------+
| 2 | run | 0 | test-id   | 1852     |
+---+-----+---+-----------+----------+
| 2 | run | 0 | test-name | 02_DUMMY |
+---+-----+---+-----------+----------+

Как вы думаете, вы можете управлятьостальные?

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