正在 SQL 服务器中解析 JSON

Parsing JSON in SQL Server

参考微软提供的例子:

DECLARE @json NVARCHAR(MAX)
SET @json =  
N'[  
       { "id" : 2,"info": { "name": "John", "surname": "Smith" }, "age": 25 },  
       { "id" : 5,"info": { "name": "Jane", "surname": "Smith" }, "dob": "2005-11-04T12:00:00" }  
 ]'  

SELECT *  
FROM OPENJSON(@json)  
  WITH (id int 'strict $.id',  
        firstName nvarchar(50) '$.info.name', lastName nvarchar(50) '$.info.surname',  
        age int, dateOfBirth datetime2 '$.dob') 

当JSON数据里面有数组时,例如:

DECLARE @json NVARCHAR(MAX)
SET @json =  
N'[  
       { "id" : 2,"info": { "name": "John", "surname": "Smith" }, 
         "Phones": ["123","345","678"] // like here
        }   
]' 

有没有办法在解析后的数据上加入数组,得到这样的结果:

 Id     First Name      Last Name    Phone
 2      John            Smith        123
 2      John            Smith        345
 2      John            Smith        678

OUTER APPLY 是你的朋友。让我们混合使用这两种行。

DECLARE @json NVARCHAR(MAX)
SET @json = N'
[
  {
    "id": 2,
    "info": {
      "name": "John",
      "surname": "Smith"
    },
    "age": 25,
    "Phones": [
      "123",
      "345",
      "678"
    ]
  },
  {
    "id": 5,
    "info": {
      "name": "Jane",
      "surname": "Smith"
    },
    "dob": "2005-11-04T12:00:00"
  }
]'  

SELECT id, [name], [surname], age, dateOfBirth, number
FROM (
    SELECT * 
    FROM OPENJSON(@json)
    WITH (
        id          INT             'strict $.id',
        [name]      NVARCHAR(50)    '$.info.name',
        [surname]   NVARCHAR(50)    '$.info.surname',
        age         INT,
        dateOfBirth DATETIME2       '$.dob',
        Phones      NVARCHAR(MAX)   AS JSON
    )
) AS people
OUTER APPLY OPENJSON(Phones)
WITH (
    number NVARCHAR(50) '$'
)

结果:

+----+------+---------+------+-----------------------------+--------+
| id | name | surname | age  |         dateOfBirth         | number |
+----+------+---------+------+-----------------------------+--------+
|  2 | John | Smith   | 25   | NULL                        | 123    |
|  2 | John | Smith   | 25   | NULL                        | 345    |
|  2 | John | Smith   | 25   | NULL                        | 678    |
|  5 | Jane | Smith   | NULL | 2005-11-04 12:00:00.0000000 | NULL   |
+----+------+---------+------+-----------------------------+--------+

您必须分两步完成:

  1. 提取每个人的数据并将 phone 个数字的数组保留为 JSON
  2. 使用 CROSS/OUTER APPLY 解析每个人的 phone 个数字数组并将结果合并在一起

像这样:

DECLARE @json NVARCHAR(MAX)
SET @json =  
N'[  
    { "id" : 2,"info": { "name": "John", "surname": "Smith" }, "Phones": ["123","345","678"] },
    { "id" : 3,"info": { "name": "Jane", "surname": "Smith" }, "Phones": ["321","543"] }
]';

WITH CTE AS (
    SELECT id, firstName, lastName, phones
    FROM OPENJSON(@json)
    WITH (
        id INT 'strict $.id',  
        firstName NVARCHAR(50) '$.info.name', 
        lastName NVARCHAR(50) '$.info.surname',
        phones NVARCHAR(MAX) '$.Phones' AS JSON
    )
)
SELECT c.id, c.firstName, c.lastName, p.value as phone
FROM CTE c
    CROSS APPLY OPENJSON(c.phones) p

嗯,你总是可以这样做:

SELECT ID,  FirstName, LastName, value 
FROM OPENJSON(@json)
WITH(ID int '$.id', 
     FirstName nvarchar(50) '$.info.name',
     LastName nvarchar(50) '$.info.surname',
     Phones nvarchar(max) '$.Phones' AS Json)
CROSS APPLY OPENJSON(Phones)

希望对您有所帮助。

您可以使用 C# 库

https://www.dotnet4techies.com/2018/07/convert-json-to-sql-format-using-csharp.html

它是一个强大的工具,如果它有嵌套级别,它会维护来自 Json 的 sql 关系。