如何在JSON-array-of-objects-column中构建一个包含WHERE子句的SQLite查询?

vx6bjr1n  于 2023-04-30  发布在  SQLite
关注(0)|答案(1)|浏览(110)

链接到这个question,我尝试在JSON列上构建SQLite高性能 * 查询。
考虑具有以下模式的DB**(伪代码)**:

** Table **
id   content  json
1    abc      [{start: some-unix-ts, end: some-unix-ts},{start: some-unix-ts, end: some-unix-ts}, between 1 to 1K+ items]
2    xyz      ...

有没有可能写一个查询,获取所有的事件,其中content = xyz,并且至少有一个事件在未来发生,或者在两个时间戳之间。在伪代码中:

SELECT * FROM events WHERE content = xyz AND start > some-unix-ts
  • )高性能的意思是(没有SQL背景):如果在一个理论上很大的数据库上,它根本没有效率,现在让我来看看!
9w11ddsr

9w11ddsr1#

您可以使用json_eachjson列中的时隙值拆分出来,然后将它们与您感兴趣的时间进行比较,从而获得所需的结果。例如(使用扩展的dbfiddle从您的前一个问题的答案):

SELECT ev.id, ev.content, json_each.value
FROM ev, json_each(ev.json)
WHERE ev.content = 'xyz' 
  AND json_each.value->>'$.start' > '07-2022'

输出:

id  content value
2   xyz     {"start":"11-2022","end":"12-2022"}
3   xyz     {"start":"09-2022","end":"10-2022"}

然而,这将不是特别有性能的。最好返回到原始表并查询它们:

SELECT e.*, t.start, t.end
FROM events e
JOIN timeslots t ON t.id = e.id
WHERE e.content = 'xyz' AND t.start > '07-2022'

输出:

id  content start   end
2   xyz     11-2022 12-2022
3   xyz     09-2022 10-2022

Demo on dbfiddle
您需要用适合您的实际时隙数据的任何内容替换start比较。

相关问题