4

我希望$..在使用存储文档json_value()的 TSQL 查询中利用函数中的优势。json不幸的是,它不起作用:

JSON 路径格式不正确。意外字符“。” 在位置 2 找到。

根据文件,甚至没有打算:

路径步骤可以包含以下元素和运算符。

键名。例如,$.name 和 $."first name"。如果键名以美元符号开头或包含空格等特殊字符,请用引号将其括起来。

数组元素。例如,$.product[3]。数组是从零开始的。

点运算符 (.) 表示对象的成员。例如,在 $.people 1 .surname 中,surname 是 people 的子代。

有没有其他方法,如何在存储在 TSQL 表列a中的结构化中找到任何级别的属性?json

例如,让我们ajson文档中的任意级别:

select json_value(json, '$..a') from data1, 2将为列中的以下值返回两个值(因此) data.json

第一的:

{
    "a": 1
}

第二:

{
    "b": {
        "a": 2
    }
}
4

1 回答 1

2

SQL Server 对 JSON 表达式的支持确实有限。

您可以将递归公用表表达式与openjson()函数混合使用。

样本数据

create table data
(
  json nvarchar(max)
);

insert into data (json) values
('{ "a": 1 }'),
('{ "b": { "a": 2 } }');

解决方案

with rcte as
(
  select x.[key] as path,
         x.[key],
         x.[value],
         x.[type]
  from data d
  cross apply openjson(d.json, '$') x
    union all
  select r.[path] + '.' + rr.[key],
         rr.[key],
         rr.[value],
         rr.[type]
  from rcte r
  cross apply openjson(r.[value]) rr
  where r.[type] = 5 -- 5=object
)
select r.[key],
       r.[value],
       r.[path]
from rcte r
where r.[key] = 'a';

结果

key value path
--- ----- ----
a   1     a
a   2     b.a

小提琴(带有中间递归公用表表达式结果)。

于 2020-11-11T12:29:44.383 回答