SQLite 3中如何使用JSON函数查询数组数据

P粉602998670

P粉602998670

2026-07-31

946人浏览

原创

mysql用json_contains可查json数组是否含某值,要求第二个参数为带双引号的json字符串(如'"banana"'),路径默认'$';sqlite则需用json_each展开数组再过滤,无法直接使用类似函数。

sqlite 3中如何使用json函数查询数组数据

json_array_contains 不能直接用字符串判断数组包含

很多人写 json_array_contains(json_col, 'apple') 发现查不到数据,是因为该函数第二个参数必须是原始值(如整数、布尔),不是 JSON 字符串。传入 '"apple"''apple' 都会失败 —— 它只接受未加引号的字面量。

  • 正确写法:json_array_contains(json_col, 'apple') ❌(字符串字面量,不生效)
  • 正确写法:json_array_contains(json_col, 'apple') 实际上仍错;真正有效的是:json_array_contains(json_col, 'apple') → 不,等等 —— 真正生效的是:json_array_contains(json_col, 'apple')?不对。查文档确认:json_array_containsvalue 参数类型是 SQL 值,不是 JSON 字符串。所以传 'apple'(SQL text)可以,但前提是 JSON 数组里存的就是 plain string,不是 "apple" 这种带引号的 JSON 字符串。
  • 更稳妥的做法是:先用 json_valid(json_col) 过滤非法 JSON,再用 json_type(json_col) = 'array' 确保是数组,最后用 json_array_contains 判断 —— 但注意:如果数组元素是对象(如 [{"name":"a"},{"name":"b"}]),json_array_contains 对整个对象无效,它只匹配标量或 null。

查询 JSON 数组中某个字段等于指定值的对象

比如 JSON 列存的是 [{"id":1,"status":"active"},{"id":2,"status":"pending"}],想查 status 为 "active" 的记录。SQLite 没有内置路径式数组遍历函数,json_extract 只能取固定下标,无法“全量扫描”。这时必须用 json_each 展开:

  • SELECT t.* FROM mytable t, json_each(t.json_col) j WHERE j.value LIKE '%"status":"active"%' —— ❌ 不可靠,属子串匹配,可能误命中
  • 正确方式:SELECT t.* FROM mytable t, json_each(t.json_col) j WHERE j.type = 'object' AND json_extract(j.value, '$.status') = 'active'
  • 注意 json_each 是表值函数,会产生多行结果;同一记录若数组中有多个匹配项,会重复返回 —— 加 DISTINCT 或用 EXISTS 包裹更安全
  • 性能敏感时,避免在大表上无条件 CROSS JOIN json_each;务必加 WHERE json_valid(json_col) 提前过滤

json_extract 取数组元素时下标越界返回 NULL,不报错

json_extract(json_col, '$[5]') 如果数组只有 3 个元素,结果就是 NULL,不是错误。这点容易被忽略,导致后续逻辑误判为“字段不存在”而非“索引超出”。

php版微信js-sdk支付接口类
php版微信js-sdk支付接口类

php版微信js-sdk支付接口类

下载
  • 检查是否存在可用下标:json_array_length(json_col) > 5
  • 取首项安全写法:json_extract(json_col, '$[0]') + WHERE json_array_length(json_col) > 0
  • json_array_getjson_extract 行为不同:json_array_get 返回 varchar 类型,且对非数组输入也返回 NULLjson_extract 支持任意路径,但要求输入是合法 JSON
  • 别依赖 json_extract 的返回类型做类型判断 —— 它永远返回 text,哪怕提取的是数字;需要数值比较时,得显式 CAST(... AS INTEGER)

高频查询 JSON 数组内容必须建表达式索引

直接写 WHERE json_array_contains(json_col, 'x')json_extract(json_col, '$.tags') LIKE '%x%' 几乎必然全表扫描。SQLite 的 B-tree 索引无法解析 JSON 内部结构,除非你告诉它“这个表达式的结果值得索引”。

  • 有效索引语句:CREATE INDEX idx_tags_contain_x ON mytable (json_extract(json_col, '$.tags')) WHERE json_valid(json_col);
  • 但注意:这个索引只加速 json_extract(json_col, '$.tags') 整体相等查询,不加速 json_array_contains 或模糊匹配
  • 真要加速数组元素存在性判断,目前唯一可行方案是冗余列:ALTER TABLE mytable ADD COLUMN has_tag_x AS (json_array_contains(json_col, 'x')) STORED;(SQLite 3.38+ 支持生成列表达式)
  • 没有生成列支持的老版本,只能靠应用层维护额外 tag 标志字段,或定期物化视图刷新

实际用起来最麻烦的不是语法,而是 SQLite 对 JSON 的“半解析”特性 —— 它能提取、能验证、能展开,但所有操作都发生在查询执行期,不参与索引构建,也不做类型推导。写 WHERE 条件前,先想清楚:这个判断能不能提前落到普通列上。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

1538

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

1423

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

587

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

1314

7

墨刀AI提示词教学
墨刀AI提示词教学

本合集由PHP中文网精心整理,为您提供全面的墨刀AI提示词教学。内容涵盖高质量原型撰写公式与实操窍门,助您轻松掌握AI设计工具。无论是零基础入门还是进阶技巧,都能让您快速上手,大幅提升产品设计与协作效率。

2026.08.04

9

21

墨刀AI完整入门
墨刀AI完整入门

PHP中文网为您倾力打造墨刀AI保姆级入门指南完整版!本合集从零基础讲起,涵盖AI生成原型、提示词优化、图片转原型及多轮对话等核心功能。无论您是新手还是进阶用户,都能轻松掌握产品设计全流程。快来PHP中文网,一键解锁高效设计技巧,让想法即刻成型!

2026.08.04

7

20

墨刀AI进阶技巧
墨刀AI进阶技巧

本合集由PHP中文网精心整理,为您提供墨刀AI核心进阶策略指南。内容涵盖高效提示词写作、原型智能生成与微调、结构化导图制作及行业分析报告输出等实战技巧。助您轻松掌握AI设计工具,大幅提升产品设计与团队协作效率。

2026.08.04

8

14

火山引擎实名认证失败怎么办
火山引擎实名认证失败怎么办

火山引擎实名认证失败可能与证件信息填写错误、姓名或企业信息不一致、证件照片不清晰、营业执照状态异常、手机号验证失败或审核资料不完整有关。本专题整理个人认证、企业认证、资料上传、审核退回、重新提交和认证不通过的常见处理方法。

2026.08.04

4

10

火山引擎域名备案流程详解
火山引擎域名备案流程详解

火山引擎域名备案适合需要在火山引擎云服务器、对象存储、CDN或网站服务上绑定域名的用户参考。本专题整理备案入口、账号实名认证、备案类型选择、主体信息填写、网站信息提交、资料上传、初审核验、管局审核和备案失败排查,帮助用户完成网站上线前的备案流程。

2026.08.04

1

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQLite参考手册
SQLite参考手册

共0课时 | 0.1万人学习

SQLite经典教程
SQLite经典教程

共51课时 | 36.8万人学习