从 SQL Server 表中读取 Json 值
Posted
技术标签:
【中文标题】从 SQL Server 表中读取 Json 值【英文标题】:Read Json Value from a SQL Server table 【发布时间】:2020-12-22 09:59:31 【问题描述】:我有一个 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
每当我执行它时,我都会收到一个空值。查询有什么问题?
感谢您的帮助!
【问题讨论】:
为什么是cast(json_val as varchar(8000))
?那个字段不是已经是文本字段了吗?至于 JSON 路径,这个 JSON 字符串是一个具有单个元素的 array。
你为什么要将这样的常规数据存储在 JSON 字段中?
【参考方案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 字符串的规则性,您应该考虑改用适当的表
【讨论】:
【参考方案2】:正如 Panagiotis 在 cmets 中所说:
关于JSON路径,这个JSON字符串是一个单一元素的数组
因此,您可以使用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 应该已经是字符串数据类型(应该/可能是 nvarchar(MAX)
),因此没有理由 CAST
它。
【讨论】:
以上是关于从 SQL Server 表中读取 Json 值的主要内容,如果未能解决你的问题,请参考以下文章
如何从sql server中的表中查询json数组类型列的值?
AWS Glue - 从 sql server 表中读取并作为自定义 CSV 文件写入 S3
如何从 SQL Server 表中读取图像数据(存储 word 文档)并将其保存到本地文件夹
在 SQL Server 中读取 JSON 数据时无法从字符串转换为日期时间
ASP.NET + SQL SERVER + JSON = 如何在 SQL Server 的两个连接表中获取数据并加载为 JSON?