Как установить больше, чем фильтр данных JSON, используя JSON_VALUE? - PullRequest
0 голосов
/ 21 октября 2018

Я просто пытаюсь установить запрос для получения данных из коллекции объекта 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' 

Как я могу это сделать?Благодаря.

1 Ответ

0 голосов
/ 21 октября 2018

Сначала ваши 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"
 }
]');

Вы можете попробовать использовать OPENJSON с CROSS 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

...