【问题标题】:How to set more than a filter over JSON data using JSON_VALUE?如何使用 JSON_VALUE 对 JSON 数据设置多个过滤器?
【发布时间】:2018-10-21 14:27:53
【问题描述】:

我只是想设置一个查询以从 JSON 对象集合中获取数据:

create table test (LINE_SPECS nvarchar(max));

insert into test values (N'
 {
  "lineName":"GHjr",
  "pipeDiameter":"12",
  "pipeLength":"52000",
  "pressure":"15",
  "volume":"107"
 },
 {
  "lineName":"Ks3R",
  "pipeDiameter":"9",
  "pipeLength":"40000",
  "pressure":"15",
  "volume":"80"
 }
');

现在,获取第一个对象的 lineName ( lineName : Ghjr) 是成功的

    select
      JSON_VALUE(LINE_SPECS, '$.lineName')     as line_name
    , JSON_VALUE(LINE_SPECS, '$.pipeDiameter') as diameter

from test
WHERE JSON_VALUE(LINE_SPECS, '$.lineName') = 'GHjr' 
;

当我尝试获得第二个“Ks3R”时这是不可能的:

    select
      JSON_VALUE(LINE_SPECS, '$.lineName')     as line_name
    , JSON_VALUE(LINE_SPECS, '$.pipeDiameter') as diameter

from test
WHERE JSON_VALUE(LINE_SPECS, '$.lineName') = 'Ks3R' 

我该怎么做? 谢谢。

【问题讨论】:

    标签: sql json sql-server tsql sql-server-2017


    【解决方案1】:

    首先,您的 JSON 数据无效,它可能是一个数组。

    看起来像这样。

    create table test (LINE_SPECS nvarchar(max));
    
    insert into test values (N'
      [
      {
      "lineName":"GHjr",
      "pipeDiameter":"12",
      "pipeLength":"52000",
      "pressure":"15",
      "volume":"107"
     },
     {
      "lineName":"Ks3R",
      "pipeDiameter":"9",
      "pipeLength":"40000",
      "pressure":"15",
      "volume":"80"
     }
    ]');
    

    您可以尝试使用OPENJSONCROSS APPLY 来解析JSON 并制作它。

    select
         t2.*
    from test t1 
    CROSS APPLY 
        OPENJSON(t1.LINE_SPECS)
        WITH
            (
                line_name varchar(MAX) N'$.lineName',
                diameter varchar(MAX) N'$.pipeDiameter'
            ) AS t2
    WHERE line_name  = 'Ks3R'
    

    sqlfiddle

    【讨论】:

    • 非常好地抓住了格式错误的 JSON。我希望我可以投票两次,一次是为了获得正确的数据,一次是为了获得正确的解决方案;)
    • @GordonLinoff 谢谢 :)
    • 非常感谢!你让我开心。
    猜你喜欢
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    相关资源
    最近更新 更多