检查 sqlite json 数组元素是否在范围内

check if sqlite json array elements in range

我有一个table,其中包含一个json列,该列有一个数组字段,我想检查数组中的数字是否属于一个范围,即每个元素是否通过谓词大于 X 且小于 Y,

select nom.id, nom.doc
from nom
join json_each(nom.doc, "$.rate") e
where e.value > 0 and e.value < 7

我希望这行得通,但行不通,我知道 json_each returns 一个 table,我想也许使用分组或聚合我可以得到什么我想要,但我想知道是否有另一种方法,我不想依赖聚合,例如,我想检查是否所有元素都通过谓词,例如,如果所有元素都大于 X,或者如果我在哪里使用字符串,如果它们都匹配一个模式等

示例数据:

id: 1, doc: {rate: [1, 2, 3]}
id: 2, doc: {rate: [1, 2, 3, 5 9]}

如果我有这两条记录,我想获取那些 rate 值小于 7 且大于 0 的记录,例如,id 为 2 的记录不应出现在我想要的查询中。

一种方法是提取 CTE 中数组的所有值,并在主查询中使用 NOT EXISTS 来检查某个 id 的所有值是否都通过谓词:

WITH cte AS (
  SELECT n.id, n.doc, e.value
  FROM nom n JOIN json_each(n.doc, "$.rate") e
)
SELECT n.id, n.doc
FROM nom n
WHERE NOT EXISTS (
  SELECT 1
  FROM cte c
  WHERE c.id = n.id AND NOT <your predicate>
);

<your predicate> 更改为:

(c.value > 0 AND c.value < 7)

参见demo