1

我有一个 Json 值作为 ntext 存储在 SQL Server 表中:

JSON(列:json_val):

[{"prime":{"image":{"id":"123","logo":"","productId":"4000","enable":true},"accountid":"78","productId":"16","parentProductId":"","aprx":"4.599"}}]
select JSON_VALUE(cast(json_val as varchar(8000)), '$.prime.aprx') as px
from table_1
where id = 1

每当我执行它时,我都会收到一个空值。查询有什么问题?

谢谢你的帮助!

4

2 回答 2

1

正如 Panagiotis 在评论中所说:

至于 JSON 路径,这个 JSON 字符串是一个具有单个元素的数组

因此,您可以使用OPENJSONwhich 来检查每个数组:

DECLARE @JSON nvarchar(MAX) = N'[{"prime":{"image":{"id":"123","logo":"","productId":"4000","enable":true},"accountid":"78","productId":"16","parentProductId":"","aprx":"4.599"}}]';

SELECT aprx
FROM (VALUES(@JSON))V(json_val)
     CROSS APPLY OPENJSON(V.json_val)
                 WITH (aprx decimal(4,3) '$.prime.aprx');

如前所述,您的 JSON 应该已经是字符串数据类型(应该/可能是nvarchar(MAX)),因此没有理由这样CAST做。

于 2020-12-22T10:07:23.697 回答
1

JSON 字符串是一个包含单个项目的数组。您需要指定数组索引来检索特定项目,例如:

declare @t table (json_val  nvarchar(4000))

insert into @t
values ('[{"prime":{"image":{"id":"123","logo":"","productId":"4000","enable":true},"accountid":"78","productId":"16","parentProductId":"","aprx":"4.599"}}]')

select JSON_VALUE(cast(json_val as varchar(8000)), '$[0].prime.aprx') as px
from @t

这返回4.599

如果要搜索所有数组条目,则必须使用 OPENJSON。如果你需要这样做,虽然......

尽可能避免使用 JSON

JSON 存储不是使用适当的表设计的替代方案。JSON 字段不能被索引,因此按特定字段过滤将始终导致全表扫描。鉴于此 JSON 字符串的规则性,您应该考虑改用适当的表

于 2020-12-22T10:07:39.920 回答