sqlite3 支持JSON sqlite3官网下载
liebian365 2024-11-13 13:24 23 浏览 0 评论
简介
在 SQLite 版本 3.38.0 (2022-02-22) 之前,JSON 函数是一个扩展,需要另外编译。本 3.38.0 之后,JSON 函数和运算符默认内置于 SQLite 。
SQLite将JSON存储为普通文本,SQLite(目前)不支持JSON的二进制编码。
默认情况下,SQLite 支持十五个函数和两个运算符来处理 JSON 值
有15个标量函数和运算符。
- json(json)
- json_array(value1,value2,...)
- json_array_length(json) / json_array_length(json,path)
- json_extract(json,path,...)
- json -> path
- json ->> path
- json_insert(json,path,value,...)
- json_object(label1,value1,...)
- json_patch(json1,json2)
- json_remove(json,path,...)
- json_replace(json,path,value,...)
- json_set(json,path,value,...)
- json_type(json) / json_type(json,path)
- json_valid(json)
- json_quote(value)
有两个聚合SQL函数。
- json_group_array(value)
- json_group_object(name,value)
这两个表值函数是:
- json_each(json) / json_each(json,path)
- json_tree(json) / json_tree(json,path)
JSON参数
对于接受 JSON 作为其第一个参数的函数,该参数可以是 JSON 对象、数组、数字、字符串或 null。
SQLite 数值和 NULL 值分别被解释为 JSON 数字和空值。
SQLite 文本值可以理解为 JSON 对象、数组或字符串。
如果将不是格式正确的 JSON 对象、数组或字符串的 SQLite 文本值传递给 JSON 函数,该函数会抛出错误。
PATH参数
对于接受PATH参数的函数,PATH必须是正确格式,否则函数将抛出一个错误。
格式正确的 PATH 是一个文本值,它正好以一个 '#39; 字符开头,后跟零个或多个".objectlabel"或"[arrayindex]" 的实例。
数组索引通常是非负整数 N。在这种情况下,所选的数组元素是数组的第 N 个元素,从左侧的零开始。数组索引也可以是“#-N”的形式,在这种情况下,所选元素是右侧的第N个元素。数组的最后一个元素是“#-1”。将“#”字符视为“数组中的元素数”。然后,表达式“#-1”的计算结果为与数组中最后一个条目对应的整数。数组索引有时只是 # 字符很有用,例如,在将值追加到现有 JSON 数组时:
json_set('[0,1,2]','$[#]','new') → '[0,1,2,"new"]'
VALUE参数
对于接受"value“参数(也显示为“value1“和”value2"),这些参数通常被理解为被引用并在结果中成为 JSON 字符串值的文字字符串。
即使输入value字符串看起来像格式正确的JSON,但它们在结果中仍被解释为字符串。
然而,如果一个value参数直接来自另一个 JSON 函数的结果或来自-> 运算符(但不是->> 运算符),则该参数被理解为实际 JSON 并插入完整的 JSON 而不是带引号的字符串。
json()函数
json(X)函数验证其参数X是一个有效的JSON字符串,并返回该JSON字符串的最小化版本(去掉所有不必要的空格)。
如果X不是一个格式正确的JSON字符串,那么这个例程会抛出一个错误。
json('{"this":" is","a":["test"]}')→'{"this":" is","a":["test"]}''
json_array()函数
json_array()SQL函数接受0个或多个参数,并返回一个由这些参数组成的格式正确的JSON数组。
如果json_array()的任何参数是一个BLOB,那么就会抛出一个错误。
json_array(1,2,'3',4) → '[1,2,"3",4]'
json_array('[1,2]') → '["[1,2]"]'
json_array(json_array(1,2)) → '[[1,2]]'
json_array(1,null,'3','[4,5]','{"six":7.7}') → '[1,null,"3","[4,5]","{\"six\":7.7}"]'
json_array(1,null,'3',json('[4,5]'),json('{"six":7.7}')) → '[1,null,"3",[4,5],{"six":7.7}]'
函数json_array_length()
json_array_length(X)函数返回JSON数组X中的元素数,如果X是数组以外的JSON值,则返回0。
X必须是正确是JSON格式。
json_array_length('[1,2,3,4]') → 4
json_array_length('[1,2,3,4]', '#39;) → 4
json_array_length('[1,2,3,4]', '$[2]') → 0
json_array_length('{"one":[1,2,3]}') → 0
json_array_length('{"one":[1,2,3]}', '$.one') → 3
json_array_length('{"one":[1,2,3]}', '$.two') → NULL
json_extract()函数
json_extract(X,P1,P2,...)从X处格式良好的JSON中提取并返回一个或多个值。
json_extract('{"a":2,"c":[4,5,{"f":7}]}', '#39;) → '{"a":2,"c":[4,5,{"f":7}]}'
json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c') → '[4,5,{"f":7}]'
json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c[2]') → '{"f":7}'
json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c[2].f') → 7
json_extract('{"a":2,"c":[4,5],"f":7}','$.c','$.a') → '[[4,5],2]'
json_extract('{"a":2,"c":[4,5],"f":7}','$.c[#-1]') → 5
json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.x') → NULL
json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.x', '$.a') → '[null,2]'
json_extract('{"a":"xyz"}', '$.a') → 'xyz'
json_extract('{"a":null}', '$.a') → NULL
-> 和 ->> 运算符
从 SQLite 版本 3.38.0 (2022-02-22) 开始, -> 和 ->> 运算符可用于提取 JSON 的子组件。
-> 和 ->> 运算符的 SQLite 实现力求与 MySQL 和 PostgreSQL 兼容。
-> 和 ->> 运算符将 JSON 字符串作为左操作数,将 PATH 表达式或对象字段标签或数组索引作为右操作数。
-> 运算符返回所选子组件的 JSON 表示,如果该子组件不存在,则返回 NULL。
->> 运算符返回代表所选子组件的 SQL TEXT、INTEGER、REAL 或 NULL 值,如果子组件不存在,则返回 NULL。
'{"a":2,"c":[4,5,{"f":7}]}' -> '#39; → '{"a":2,"c":[4,5,{"f":7}]}'
'{"a":2,"c":[4,5,{"f":7}]}' -> '$.c' → '[4,5,{"f":7}]'
'{"a":2,"c":[4,5,{"f":7}]}' -> 'c' → '[4,5,{"f":7}]'
'{"a":2,"c":[4,5,{"f":7}]}' -> '$.c[2]' → '{"f":7}'
'{"a":2,"c":[4,5,{"f":7}]}' -> '$.c[2].f' → '7'
'{"a":2,"c":[4,5],"f":7}' -> '$.c[#-1]' → '5'
'{"a":2,"c":[4,5,{"f":7}]}' -> '$.x' → NULL
'[11,22,33,44]' -> 3 → '44'
'[11,22,33,44]' ->> 3 → 44
'{"a":"xyz"}' -> '$.a' → '"xyz"'
'{"a":"xyz"}' ->> '$.a' → 'xyz'
'{"a":null}' -> '$.a' → 'null'
'{"a":null}' ->> '$.a' → NULL
json_insert(),json_replace,and json_set()函数
json_insert()、json_replace和json_set()函数都以一个JSON值作为它们的第一个参数,后面跟着零个或多个路径和值参数对,并返回一个新的JSON字符串,这个字符串是通过更新输入的JSON的路径/值对形成的。
这些函数的不同之处仅在于它们如何处理创建新值和覆盖已有值。
json_insert('[1,2,3,4]','$[#]',99) → '[1,2,3,4,99]'
json_insert('[1,[2,3],4]','$[1][#]',99) → '[1,[2,3,99],4]'
json_insert('{"a":2,"c":4}', '$.a', 99) → '{"a":2,"c":4}'
json_insert('{"a":2,"c":4}', '$.e', 99) → '{"a":2,"c":4,"e":99}'
json_replace('{"a":2,"c":4}', '$.a', 99) → '{"a":99,"c":4}'
json_replace('{"a":2,"c":4}', '$.e', 99) → '{"a":2,"c":4}'
json_set('{"a":2,"c":4}', '$.a', 99) → '{"a":99,"c":4}'
json_set('{"a":2,"c":4}', '$.e', 99) → '{"a":2,"c":4,"e":99}'
json_set('{"a":2,"c":4}', '$.c', '[97,96]') → '{"a":2,"c":"[97,96]"}'
json_set('{"a":2,"c":4}', '$.c', json('[97,96]')) → '{"a":2,"c":[97,96]}'
json_set('{"a":2,"c":4}', '$.c', json_array(97,96)) → '{"a":2,"c":[97,96]}'
json_object()函数
json_object()SQL函数接受0个或多个参数对,并返回一个由这些参数组成的格式良好的JSON对象。
每对参数的第一个参数是标签,第二个参数是值。
如果json_object()的任何参数是一个BLOB,那么就会抛出一个错误。
json_object()函数目前允许重复的标签,不过这一点可能会在未来的改进中改变。
json_object('a',2,'c',4) → '{"a":2,"c":4}'
json_object('a',2,'c','{e:5}') → '{"a":2,"c":"{e:5}"}'
json_object('a',2,'c',json_object('e',5)) → '{"a":2,"c":{"e":5}}'
json_patch()函数
json_patch(T,P)SQL函数运行RFC-7396 MergePatch算法,将补丁P应用于输入T。返回T的补丁副本。
json_patch('{"a":1,"b":2}','{"c":3,"d":4}') → '{"a":1,"b":2,"c":3,"d":4}'
json_patch('{"a":[1,2],"b":2}','{"a":9}') → '{"a":9,"b":2}'
json_patch('{"a":[1,2],"b":2}','{"a":null}') → '{"b":2}'
json_patch('{"a":1,"b":2}','{"a":9,"b":null,"c":8}') → '{"a":9,"c":8}'
json_patch('{"a":{"x":1,"y":2},"b":3}','{"a":{"y":9},"c":8}') → '{"a":{"x":1,"y":9},"b":3,"c":8}'
json_remove()函数
json_remove(X,P,...)函数的第一个参数是一个JSON值,后面是0个或多个路径参数。
json_remove(X,P,...)函数返回一个X参数的副本,其中包含所有由路径参数标识的元素。
选择X中没有的元素的路径会被默默忽略。
从左到右依次进行删除。之前的删除造成的改变会影响后续参数的路径搜索。
如果调用json_remove(X)函数时没有路径参数,那么它将返回重新格式化的输入X,并删除多余的空白。
json_remove('[0,1,2,3,4]','$[2]') → '[0,1,3,4]'
json_remove('[0,1,2,3,4]','$[2]','$[0]') → '[1,3,4]'
json_remove('[0,1,2,3,4]','$[0]','$[2]') → '[1,2,4]'
json_remove('[0,1,2,3,4]','$[#-1]','$[0]') → '[1,2,3]'
json_remove('{"x":25,"y":42}') → '{"x":25,"y":42}'
json_remove('{"x":25,"y":42}','$.z') → '{"x":25,"y":42}'
json_remove('{"x":25,"y":42}','$.y') → '{"x":25}'
json_remove('{"x":25,"y":42}','#39;) → NULL
json_type()函数
json_type(X)函数返回X中最外层元素的 "类型"。json_type(X,P)函数返回X中被路径P选中的元素的 "类型"。json_type()返回的 "类型 "是以下SQL文本值之一。
null,"true","false","integer","real","text","array",或 "object"。如果json_type(X,P)中的路径P选择了一个在X中不存在的元素,那么这个函数返回NULL。
json_type('{“ a”:[2,3.5,true,false,null,“ x”]}')→'对象'
json_type('{“ a”:[2,3.5,true,false,null,“ x”]}','#39;)→'object'
json_type('{“ a”:[2,3.5,true,false,null,“ x”]}','$。a')→'array'
json_type('{“ a”:[2,3.5,true,false,null,“ x”]}','$。a [0]')→'integer'
json_type('{“ a”:[2,3.5,true,false,null,“ x”]}','$。a [1]')→'real'
json_type('{“ a”:[2,3.5,true,false,null,“ x”]}','$。a [2]')→'true'
json_type('{“ a”:[2,3.5,true,false,null,“ x”]}','$。a [3]')→'false'
json_type('{“ a”:[2,3.5,true,false,null,“ x”]}','$。a [4]')→'null'
json_type('{“ a”:[2,3.5,true,false,null,“ x”]}','$。a [5]')→'text'
json_type('{“ a”:[2,3.5,true,false,null,“ x”]}','$。a [6]')→NULL
json_valid()函数
json_valid(X)函数如果参数X是格式正确的JSON,则返回1,如果参数X不是格式正确的JSON,则返回0。
json_valid('{"x":35}') → 1
json_valid('{"x":35') → 0
json_quote()函数
json_quote(X)函数将SQL值X(一个数字或一个字符串)转换为其相应的JSON表示。
如果X已经是格式正确的JSON,那么这个函数就没有作用。
json_quote(3.14159) → 3.14159
json_quote('verdant') → '"verdant"'
json_quote('[1]') → '"[1]"'
json_quote(json('[1]')) → '[1]'
json_quote('[1,') → '"[1"'
json_group_array()和json_group_object()聚合SQL函数
json_group_array(X)函数是一个聚合SQL函数,该函数返回一个由聚合中所有X值组成的JSON数组。
同样,json_group_object(NAME,VALUE)函数返回由聚合中的所有NAME / VALUE对组成的JSON对象。
json_each()和json_tree()的表值函数
json_each(X) 和 json_tree(X)表值函数遍历作为其第一个参数提供的 JSON 值,并为每个元素返回一行。
json_each(X) 函数仅遍历顶级数组或对象的直接子元素,或者如果顶级元素是原始值,则仅遍历顶级元素本身。json_tree(X) 函数从顶级元素开始递归遍历 JSON 子结构。
json_each(X,P)和json_tree(X,P)函数的工作原理和它们的单参数对应函数一样,只是它们将路径P所标识的元素视为顶层元素。
总结
如果是小应用sqlite还是不错的选择,现在还支持了JSON,很Nice!
相关推荐
- 4万多吨豪华游轮遇险 竟是因为这个原因……
-
(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...
- “菜鸟黑客”必用兵器之“渗透测试篇二”
-
"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...
- 科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白
-
作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...
- 麦子陪你做作业(二):KEGG通路数据库的正确打开姿势
-
作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...
- 知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势
-
智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...
- 每日新闻播报(September 14)_每日新闻播报英文
-
AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...
- 香港新巴城巴开放实时到站数据 供科技界研发使用
-
中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...
- 5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper
-
本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...
- Qt动画效果展示_qt显示图片
-
今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...
- 如何从0到1设计实现一门自己的脚本语言
-
作者:dong...
- 三年级语文上册 仿写句子 需要的直接下载打印吧
-
描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...
- C++|那些一看就很简洁、优雅、经典的小代码段
-
目录0等概率随机洗牌:1大小写转换2字符串复制...
- 二年级上册语文必考句子仿写,家长打印,孩子照着练
-
二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)