从 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读取MSSQL数据库中某个字段的值

ASP.NET + SQL SERVER + JSON = 如何在 SQL Server 的两个连接表中获取数据并加载为 JSON?