从 SQL 服务器 table 读取 Json 值

Read Json Value from a SQL Server table

我有一个 Json 值存储在 SQL 服务器 table 作为 ntext:

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

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

感谢您的帮助!

正如 Panagiotis 在评论中所说:

As for the JSON path, this JSON string is an array with a single element

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

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 应该已经是字符串数据类型(应该 be/probably 和 nvarchar(MAX)),因此没有理由 CAST 它。

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

这个returns4.599

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

尽可能避免JSON

JSON 存储 而不是 使用适当 table 设计的替代方案。 JSON 字段无法编入索引,因此按特定字段过滤将始终导致完整 table 扫描。鉴于此 JSON 字符串的规律性,您应该考虑使用适当的 tables 代替