SQLite 判断 JSON 数组是否包含某元素

news/2024/11/19 15:10:52/

文章目录

  • 1.问题
  • 2.json_each()
    • 简介
    • 语法
    • 示例
  • 3.实现
  • 参考文献

1.问题

假如入有一个如下的 SQLite 表。

id   | tags                
---- | -------------------
1    | ["love","sadness"]
2    | ["love"]            
3    | ["happiness","joy"]

如果想查询 tag 列中包含 love 的所有行,在 MySQL 中有 JSON_CONTAINS 可以使用,比如下面的 SQL:

SELECT * from my_table WHERE JSON_CONTAINS(tags, '"love"')

但是在 SQLite 中并没有类似 JSON_CONTAINS 的函数。

2.json_each()

如果要在 SQLite 中判断一个JSON 数组中是否包含某个值,可以使用 SQLite 的 JSON1 扩展库。该扩展库提供了一些函数,可以帮助我们提取 JSON 数据中的元素和信息。

简介

其中 json_each() 函数是一个表值函数,类似的函数还有 json_tree()。

所谓的表值函数,指函数结果是由多行构成的一个虚拟表,而非单一的值。

json_each() 函数遍历指定 JSON 文档,为每个直接子元素生成一行,最终返回由所有的行组成的结果集。

语法

json_each(json, path)

json 必需的,一个 JSON 文档。path 可选的,一个路径表达式。

json_each() 函数返回一个具有以下列的结果集:

key
如果 JSON 为数组,则 key 列为数组的索引;如果 JSON 为对象,则 key 列为对象的成员名称;其他情况, key 列为 NULL。value
当前元素的值。type
当前元素的 JSON 类型。可能的值: 'null'、'true'、'false'、'integer'、'real'、'text'、'array'、'object'。 他们与 json_type() 函数相同。atom
如果 value 是 JSON 原始类型,atom 存储其对应的 SQL 值;否则该列为 NULL。id
标识此行唯一性的一个整数。parent
父元素的整数 ID。 此列永远为 NULL。fullkey
它是当前行元素的路径。path
当前行元素的父元素的路径。

示例

遍历一个 JSON 数组中的元素:

SELECT * FROM json_each('[1, 2, 3]');
key  value  type     atom  id  parent  fullkey  path
---  -----  -------  ----  --  ------  -------  ----
0    1      integer  1     1           $[0]     $
1    2      integer  2     2           $[1]     $
2    3      integer  3     3           $[2]     $

遍历一个 JSON 对象中的元素:

SELECT * FROM json_each('{"x": 1, "y": 2}');
key  value  type     atom  id  parent  fullkey  path
---  -----  -------  ----  --  ------  -------  ----
x    1      integer  1     2           $.x      $
y    2      integer  2     4           $.y      $

遍历一个 JSON 数组中的通过路径指定的元素:

SELECT * FROM json_each('[{"x": 1, "y": 2}]', '$[0]');
key  value  type     atom  id  parent  fullkey  path
---  -----  -------  ----  --  ------  -------  ----
x    1      integer  1     3           $[0].x   $[0]
y    2      integer  2     5           $[0].y   $[0]

3.实现

利用 json_each() 将数组展开,生成一个虚拟表。然后再判断该虚拟表中是否包含指定元素。

回到最初的问题,可以借助 json_each() 查询 JSON 数组包含指定元素的记录。

SELECT *
FROM my_table
WHERE EXISTS (SELECT 1 FROM json_each(tags) WHERE value = 'love')
ORDER BY id ASC;

结果:

id  tags               
--  -------------------
1   ["love","sadness"] 
2   ["love"]        

参考文献

JSON Functions And Operators - SQLite
Is there a method to check if an array includes one value in … - stackoverflow.com
SQLite json_each() 函数 - 数据库教程


http://www.ppmy.cn/news/238892.html

相关文章

外边距(margin)和内边距(padding)

在CSS中,外边距(margin)和内边距(padding)是用来控制元素周围空白区域的属性。 外边距(margin): 外边距定义了元素与其周围元素之间的空白区域。外边距可以设置为正值、负值或百分…

Scrapy 入门教程

Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。 Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,…

100种思维模型之事物关系思维模型-72

具体的事物是形象的、容易观察和理解的,而事物间的关系则容易让人忽视,乃至无法意识到它正在发生作用。 生活中,我们习惯于低估事物关系的影响。 事物关系思维模型一个提醒我们关注事物关系、从宏观层面找到更好的工作方向、实现可持续发展的…

全排列--回溯

1题目 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2: 输入&#xff1a…

Python数据攻略-Pandas常用数据操作

大家好,我是Mr数据杨。今天我将带领各位走进Python的奇妙世界,就像步入三国演义那样热闹且复杂的战争年代。这里,数据就像那些智勇双全的武将和策士,我们要学习如何访问和修改它们,就如同诸葛亮那样掌控战局。 先来理…

fs基本使用

//文件下载 var fs require("fs"); var path require("path"); var request require("request");var download function (item) {let url"https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json"// https://geo.datav.al…

Mac Xshell 下载 (FinallShell)

Mac Xshell 下载 找了好久 的Mac Xshell 下载 finallshell 找了好久 的Mac Xshell 下载 finallshell 自从换了Mac工作电脑 一直没有找到过好用的 Xshell,今天突然发现了这个。太好用了 FinalShell 官网:http://www.hostbuf.com/ 以下是从官网拷贝的。 FinalShell是…

s3fsfuse调试

这里由于是调试fuse操作,所以使用attach process的方式调试,方式参照《vscode使用attach process调试进程》这篇笔记 libfuse.so里面代码暂时不知道怎么跳进去 所以我这里挨个点进定义的首行代码打上断点。 一、测试ll /mnt/s3 s3fs_getattr s3fs_ac…