【问题标题】:Extracting JSON values from a SQL Server NVARCHAR column从 SQL Server NVARCHAR 列中提取 JSON 值
【发布时间】:2023-04-02 13:42:02
【问题描述】:

我正在尝试提取值,但总是返回 NULL。

DECLARE @TestTable TABLE
(
    JSON_Column NVARCHAR(MAX)
)

INSERT INTO @TestTable
VALUES
(
    (SELECT 111111 AS idTest1, 222222 AS idTest2 FOR JSON PATH)
);

SELECT 
    JSON_Column,
    JSON_VALUE(JSON_Column,'$.idTest1') AS idTest1,
    JSON_VALUE(JSON_Column,'$.idTest2') AS idTest2

FROM @TestTable

结果:

[{"idTest1":111111,"idTest2":222222}]   NULL    NULL

预期:

[{"idTest1":111111,"idTest2":222222}]   111111  222222

【问题讨论】:

    标签: json sql-server sql-server-2016


    【解决方案1】:

    这在我看来是您的 JSON 未按预期运行的问题。

    您的 JSON 是一个 数组,其中包含两个值 idTest1idTest2。您的路径 $.idTest1 不起作用,因为值存在于数组条目中。查看 JSON 输出:

    [{"idTest1":111111,"idTest2":222222}]  -- The square brackets are a dead giveaway!
    

    由于数组,您需要更改路径以将其 first 元素考虑在内:

    SELECT JSON_Column,
           JSON_VALUE(JSON_Column,'$[0].idTest1') AS idTest1,
           JSON_VALUE(JSON_Column,'$[0].idTest2') AS idTest2
      FROM @TestTable
    

    请注意,我已将路径更改为 $[0].idTest1。这将选择数组中第一个元素的 idTest1 值。

    顺便说一句,如果您启用了严格的路径匹配,这将给您一个错误(应该如此),并且可能会帮助您更快地诊断问题。

    一个有效的小提琴是here

    【讨论】:

    • 效果很好。谢谢!
    【解决方案2】:

    您可以像这样在FOR JSON PATH 子句上使用WITHOUT_ARRAY_WRAPPER 选项:

    DECLARE @TestTable TABLE
    (
        JSON_Column NVARCHAR(MAX)
    );
    
    INSERT INTO @TestTable
    VALUES
    (
        (SELECT 111111 AS idTest1, 222222 AS idTest2 
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER )
    ),
    (
        (SELECT 3333 AS idTest1, 44444 AS idTest2 
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER )
    );
    
    SELECT 
        JSON_Column,
        JSON_VALUE(JSON_Column,'$.idTest1') AS idTest1,
        JSON_VALUE(JSON_Column,'$.idTest2') AS idTest2
    FROM @TestTable
    

    结果:

    JSON_Column                          idTest1    idTest2
    {"idTest1":111111,"idTest2":222222}  111111      222222
    {"idTest1":3333,"idTest2":44444}     3333        44444
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      相关资源
      最近更新 更多