SQL 如何高效查询 JSON 数组中任意元素包含某值的记录
发布时间 - 2026-01-29 00:00:00 点击率:次PostgreSQL用jsonb_path_exists配合$.[*] ? (@.field == "value")高效查JSON数组任意元素匹配,需jsonb类型和jsonb_path_ops索引;MySQL用JSON_CONTAINS或JSON_SEARCH;SQL Server用OPENJSON+WITH+TOP避免性能陷阱;禁用LIKE硬扫JSON字符串。
PostgreSQL 中用 jsonb_path_exists 查 JSON 数组任意元素匹配
PostgreSQL 12+ 原生支持路径表达式,查 JSON 数组中「任意一个元素包含某字段值」最高效的方式不是展开数组,而是用 jsonb_path_exists 配合 $[*] ? (@.field == "value") 这类存在性断言。
它底层走索引(需配合 jsonb_path_ops 索引),不生成中间行集,比 jsonb_array_elements + EXISTS 快一个数量级。
- 必须确保字段是
jsonb类型,json不支持该函数 - 路径表达式里
@指当前遍历元素,$[*]表示根数组所有项 - 字符串值要加双引号,数字不用:
@.status == "active",不是@.status == active - 区分大小写,如需忽略,改用
lower(@.name) == "alice"
MySQL 8.0 用 JSON_CONTAINS 或 JSON_SEARCH 判断数组成员
MySQL 没有直接的「数组中任一对象含某键值对」语法,得组合函数。推荐优先用 JSON_CONTAINS——但它要求目标值本身是合法 JSON 值,且只能查「完全相等」;若查子字符串或模糊匹配,得 fallback 到 JSON_SEARCH。
-
JSON_CONTAINS(col, '"pending"', '$.statuses'):查statuses数组是否含字符串"pending"(注意外层引号) -
JSON_SEARCH(col, 'one', 'error%', null, '$.logs[*].level'):在每个logs对象的level字段中模糊搜error%,返回首个匹配路径或NULL - 二者都支持
WHERE条件下推,但无法利用函数索引加速,建议
对高频查询字段冗余普通列
SQL Server 用 OPENJSON + EXISTS 时避免性能陷阱
SQL Server 的 OPENJSON 默认把整个 JSON 数组展开成行集,如果数组很长、记录很多,EXISTS (SELECT * FROM OPENJSON(...)) 容易触发大量临时行生成,拖慢查询。
- 务必加
WITH子句明确 schema,避免默认返回所有字段的开销 - 在
OPENJSON外层加TOP (1),让引擎尽早短路:EXISTS (SELECT TOP (1) 1 FROM OPENJSON(...) WITH (state NVARCHAR(20) '$.state') WHERE state = 'failed') - 若 JSON 结构固定,考虑用计算列 + 持久化索引替代每次解析:
ALTER TABLE t ADD status_list AS JSON_VALUE(data, '$.statuses') PERSISTED
通用避坑:别用 LIKE 或正则硬扫 JSON 字符串
看到 data LIKE '%\"type\":\"admin\"%' 这种写法就该警觉——它完全绕过 JSON 解析逻辑,既不可靠(字段顺序/空格/转义会破坏匹配),又无法使用任何索引,数据量一过万就明显卡顿。
- JSON 中的引号、反斜杠、换行都会导致
LIKE匹配失效 - 即使加了全文索引,也是对原始字符串建索,和语义无关
- 跨数据库迁移时,这种写法基本 100% 报错或行为不一致
真正难的不是写出能跑的 SQL,而是让 JSON 查询在 100 万行表里依然保持毫秒响应——这取决于你选的是语义解析路径,还是字符串暴力扫描路径。
# mysql
# js
# json
# 显卡
# ai
# 键值对
# json数组
# sql
# NULL
# select
# Error
# 字符串
# 对象
# table
# postgresql
# 数据库
# 的是
# 组中
# 子句
# 遍历
# 这类
# 不支持
# 很长
# 报错
# 如需
# 但它
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
JS碰撞运动实现方法详解
jQuery中的100个技巧汇总
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
如何安全更换建站之星模板并保留数据?
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
如何快速辨别茅台真假?关键步骤解析
Linux系统运维自动化项目教程_Ansible批量管理实战
怎样使用JSON进行数据交换_它有什么限制
Angular 表单中正确绑定输入值以确保提交与验证正常工作
开心动漫网站制作软件下载,十分开心动画为何停播?
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
Android GridView 滑动条设置一直显示状态(推荐)
利用vue写todolist单页应用
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
如何续费美橙建站之星域名及服务?
如何打造高效商业网站?建站目的决定转化率
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
bootstrap日历插件datetimepicker使用方法
成都网站制作公司哪家好,四川省职工服务网是做什么用?
北京企业网站设计制作公司,北京铁路集团官方网站?
如何快速生成可下载的建站源码工具?
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
如何用PHP快速搭建高效网站?分步指南
,怎么在广州志愿者网站注册?
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
Laravel如何使用.env文件管理环境变量?(最佳实践)
php 三元运算符实例详细介绍
Python3.6正式版新特性预览
Laravel如何记录自定义日志?(Log频道配置)
Laravel如何使用Vite进行前端资源打包?(配置示例)
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
如何用JavaScript实现文本编辑器_光标和选区怎么处理
高防服务器租用首荐平台,企业级优惠套餐快速部署
zabbix利用python脚本发送报警邮件的方法
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
Laravel Session怎么存储_Laravel Session驱动配置详解
微信公众帐号开发教程之图文消息全攻略
中国移动官方网站首页入口 中国移动官网网页登录
如何在阿里云虚拟服务器快速搭建网站?
如何在橙子建站上传落地页?操作指南详解
Laravel如何优化应用性能?(缓存和优化命令)
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
Laravel如何实现数据库事务?(DB Facade示例)
微信h5制作网站有哪些,免费微信H5页面制作工具?
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
,南京靠谱的征婚网站?


