【问题标题】:Between clause on Array of numerical values in row for JSON type columnJSON类型列的行中数值数组的Between子句
【发布时间】:2021-11-22 20:11:57
【问题描述】:

我有一个单列包含 JSON 类型对象(列类型 nvarchar)的表,并且需要过滤行。

JSON 对象是一个包含多个字段的对象数组,有没有一种方法可以在数组的每个值上应用 between 子句,如果匹配则返回该行。

ROW_1 = [{"key": 12}, {"key": 13}, {"key": 19}]

对于上述字符串,如果 between 子句的范围在 15 到 22 之间,则应选择该行。

我在上述要求中看到了两个挑战,一是使用通配符选择所有键,另一个是在每个值上应用 between 子句。

类似的用例是选择一行,如果它与我执行以下操作的值相匹配

select * 
from table 
where CAST(JSON_QUERY(column, '$'), nvarchar(max)) LIKE '%"key": 12%'

让我知道这是否可以使用 T-SQL 查询来完成。

附言。其他替代方法包括使用 python 加载所有数据并在那里过滤。 (但我担心我每次都需要加载完整的数据,这可能会由于将来行数的增加而减慢过滤速度)。

【问题讨论】:

  • 15 to 22 之间应该是哪个?任何键的值或所有键的值?
  • JSON 无效(应该是[{"key": 12}, {"key": 13}, {"key": 19}])。
  • @ArunPalanisamy 任意键值

标签: json sql-server json-value


【解决方案1】:

您可以使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 2017-12-04
    • 1970-01-01
    相关资源
    最近更新 更多