从 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 代替
我有一个 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 代替