【问题标题】:JSON Parsing in SQLSQL 中的 JSON 解析
【发布时间】:2019-09-23 19:32:06
【问题描述】:

我正在尝试以表格形式解析 sql server 中的 JSON 数组 这是数据字符串

CREATE TABLE #JSONData
(
[gca] NVARCHAR(MAX)
,[User] INT
);
INSERT INTO #JSONData
VALUES ('
{"items":[{"i":"image1",
                 "url":"url-1",
                 "name":"Product 1",
                 "quantity":"1",
                 "sku":"112233",
                 "subtotal":"$24.99"},
                 {"i":image3",
                 "url":"url-3",
                 "name":"Product 3",
                 "quantity":"1",
                 "sku":"112255",
                 "subtotal":"$7.99"}]}
        ', 1)

我正在使用 微软 SQL Server 2016

我正在尝试使用 IS JSON 函数来检查它是否是有效的 JSON 字符串 - 肯定的 但是,我在使用 JSON _VALUE 函数时得到空输出

SELECT [User],
       [gca], 
       ISJSON([gca]) AS [ISJSON], 
       JSON_VALUE([gca], '$.i') AS [i],
       JSON_VALUE([gca], '$.name') AS [Product],
       JSON_VALUE([gca], '$.quantity') AS [Quantity],
       JSON_VALUE ([gca], '$.subtotal') AS [subtotal],
       [User]

FROM #JSONData

【问题讨论】:

    标签: arrays json sql-server parsing


    【解决方案1】:

    以下方法可以帮助您获得预期的结果。函数JSON_VALUEJSON 字符串中提取一个标量值。输入$.items 部分JSON 是一个JSON 数组,因此您需要使用带有显式架构的OPENSJSON() 来将此JSON 数组解析为一个表:

    表:

    CREATE TABLE #JSONData ( 
       [gca] NVARCHAR(MAX),
       [User] INT
    ); 
    INSERT INTO #JSONData 
    VALUES 
       (N'
    {"items":[{"i":"image1",
                     "url":"url-1",
                     "name":"Product 1",
                     "quantity":"1",
                     "sku":"112233",
                     "subtotal":"$24.99"},
                     {"i":"image3",
                     "url":"url-3",
                     "name":"Product 3",
                     "quantity":"1",
                     "sku":"112255",
                     "subtotal":"$7.99"}]}
            ', 1)
    

    声明:

    SELECT 
       j.*,
       d.[User] AS u
    FROM #JSONData d
    CROSS APPLY OPENJSON(d.[gca], '$.items') WITH (
       i varchar(100) '$.i',
       p varchar(50) '$.name',
       q int '$.quantity',
       s varchar(20) '$.subtotal'
    ) j
    

    输出:

    ---------------------------------
    i       p           q   s       u
    ---------------------------------
    image1  Product 1   1   $24.99  1
    image3  Product 3   1   $7.99   1
    

    【讨论】:

    • 您好@Zhorov :),我尝试运行此程序,但在关键字“with”附近出现语法错误。如果该语句是一个公用表表达式、一个 xmlnamespaces 子句或一个更改跟踪上下文子句,则前面的语句必须以分号结束
    • @oneThousand3 您的 JSON 中有一个小错误 - "i":image3" 应该是 "i":"image3"。答案中的陈述运行正确。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    相关资源
    最近更新 更多