json - JSON类型列的行中数值数组的Between子句
问题描述
我有一个包含 JSON 类型对象(列类型nvarchar
)的单列表,并且需要过滤行。
JSON对象是一个包含多个字段的对象数组,有没有一种方法可以在数组的每个值上应用 between 子句,如果匹配则返回该行。
ROW_1 = [{"key": 12}, {"key": 13}, {"key": 19}]
对于上述字符串,如果 between 子句的范围在 15 到 22 之间,则应选择该行。
我在上述要求中看到了两个挑战,1 是使用 wild_cards 来选择所有键,而另一个是在每个值上应用 between 子句。
类似的用例是选择一行,如果它与我执行以下操作的值匹配
select *
from table
where CAST(JSON_QUERY(column, '$'), nvarchar(max)) LIKE '%"key": 12%'
让我知道这是否可以使用 T-SQL 查询来完成。
PS。其他替代方法包括使用 python 加载所有数据并在那里过滤。(但我担心的是,我每次都需要加载完整的数据,这可能会由于未来行数的增加而减慢过滤速度)。
解决方案
您可以使用APPLY
运算符和OPENJSON()
调用来解析存储的 JSON 并应用适当的WHERE
子句:
SELECT *
FROM (VALUES (N'[{"key": 12}, {"key": 13}, {"key": 19}]')) v (JsonData)
CROSS APPLY OPENJSON(v.JsonData) WITH ([key] int '$.key') j
WHERE j.[key] BETWEEN 5 AND 12
推荐阅读
- ubuntu - 删除 usr/share/mime 并且无法登录用户帐户(不断询问密码)
- ios - SDWebImageOptions.refreshCached 不刷新缓存
- python - Google Drive Python API 可恢复媒体(分块上传)慢
- firebase - 获取一个 firebase 集合并遍历数据:有多少数据库读取?
- python - python:从文件中读取表(从漂亮表创建)并保留空间
- c# - Azure Service Fabric:通过 HTTP 连接比通过 HTTPS 快 10-30 倍。TLS 握手时间过长
- javascript - 如何在 Google Apps 脚本中获取选定的表
- java - 在 Raspbian 上加载库
- python - 在 PySpark 中使用“窗口”功能按天分组的问题
- mysql - 使用电源查询的 Power BI 自定义 MySQL 连接器