SQL Server JSON_VALUE 语法

8
我创建了一个包含25个列的SQL Server表格,其中一个列实际上是JSON文本,以nvarchar(max)的形式存储。
现在我需要能够查询这个JSON列并解析出其中的各种属性。我尝试将JSON_VALUE应用于我的列,但是似乎做错了什么;我的查询运行了,但所有值都返回NULL。
JSON本身看起来像:
[
 {
  "lineName":"GHjr",
  "pipeDiameter":"12",
  "pipeLength":"52000",
  "pressure":"15",
  "volume":"107"
 },
 {
  "lineName":"Ks3R",
  "pipeDiameter":"9",
  "pipeLength":"40000",
  "pressure":"15",
  "volume":"80"
 }
]

我使用的SQL语句是:
select
 DOC_ID, LINE_SPECS,
 JSON_VALUE(LINE_SPECS, '$.lineName')     as line_name,
 JSON_VALUE(LINE_SPECS, '$.pipe_Diameter') as diameter
from dbo.MY_TEST_DOCS
where ISJSON(LINE_SPECS) > 0
  and len(LINE_SPECS) > 3

然而,我的两个“已解析”列都返回空值。我该如何从此列解析出这五个属性?


JSON_VALUE设置为strict模式,以查看是否出现任何错误。默认模式是lax,不会产生错误,只会返回NULL。https://learn.microsoft.com/en-us/sql/relational-databases/json/json-path-expressions-sql-server 此外,我认为$.pipe_Diameter应该是$.pipeDiameter - SS_DBA
1
如果你移除方括号,并使你的选择与JSON中区分大小写的名称匹配,它将返回一个值。 - dfundako
实际上,如果它是一个数组,括号可能没问题。 - SS_DBA
2
我不确定它是否有效。您可以使用JSON_QUERY,但仍需要在方括号之前使用名称进行调用。 - dfundako
不确定我们是否看到了完整的JSON。 - SS_DBA
我粘贴的JSON“片段”确实是特定记录的所有JSON。而且,是一个数组。 是的,我看到我打错字了...@dfundako - 你是说我需要从JSON列本身中删除开放和关闭括号吗?所以,在尝试查询之前,我需要运行更新来清理文本,对吗? - CarCrazyBen
1个回答

6
Without the [] ISJSON is returning false
With [] ISJSON retuns true
Without the [] JSON_VALUE returns NULLs
With [] JSON_VALUE returns values

dbfddle.uk有可用的SQL Server 2016....

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"
 }
');

select * 
from test
where ISJSON(LINE_SPECS) > 0
;

GO
| LINE_SPECS |
| :--------- |
select
      JSON_VALUE(LINE_SPECS, '$.lineName')     as line_name
    , JSON_VALUE(LINE_SPECS, '$.pipeDiameter') as diameter
from test
;
GO
line_name | diameter
:-------- | :-------
GHjr      | 12      

dbfiddle 这里


(还有其他人),你们的回答真的帮了我很多!我苦苦挣扎的JSON包括了开头和结尾的括号。我创建了第二列,没有这些括号,然后JSON_VALUE按预期工作了。 感谢大家的帮助! - CarCrazyBen
@CarCrazyBen,你能否“接受”这个答案吗?Stack Overflow上有许多看起来没有答案的问题,这使得其他人更难找到类似问题的答案。 - Paul Maxwell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接