【mysql】mysql5.7支持的json字段查询【mybatis】
mysql5.7支持的json字段查询
参考:https://www.cnblogs.com/ooo0/p/9309277.html
参考:https://www.cnblogs.com/pfdltutu/p/9019444.html
使用示例:
存储结构如下:

1.以json字段作为查询条件:[json字段全部是JSONObject类型的]
SELECT
*
FROM
worksheet_data_table_data w
WHERE
w.val -> '$.input_0' LIKE '%0%'
查询结果:

2.判断JSON字段,是JSONObject类型还是JSONArray类型
SELECT
w.val,
JSON_TYPE( w.val )
FROM
worksheet_data_table_data w
查询结果:

3.查询JSON字段是 Array的JSON类型的
SELECT
w.val,
JSON_TYPE( w.val )
FROM
worksheet_data_table_data w where
JSON_TYPE(w.val) = 'ARRAY'
查询结果:

4.以json字段为查询条件[查询JSONArray]类型 [like查询]
SELECT
*
FROM
worksheet_data_table_data w
WHERE
w.val -> '$[*].*' LIKE '%峰%'
解释:
w.val -> '$[*].*' LIKE '%峰%' 1.w.val字段是JSON数组[无所谓JSONObject还是JSONArray]
[反正如果按照对象查,那数组是匹配不到的]
[反之,如果按照数组查,对象也是匹配不到的] 2.'$[*].*'
代表查询JSONArray 数组格式的JSON字符串中,
第一个* 代表任意下标
第二个* 代表任意属性 3.LIKE '%峰%'
匹配条件和正常sql 查询条件一样 写
查询结果如下:

5.以json字段为查询条件[查询JSONArray]类型 [=查询]
等于查询不同于like的查询,需要在外面包裹一层JSON_CONTAINS()
比如数据集如下:

想要 查询 出 name字段 既等于"亚瑟" 又等于"jj"的json字段
SELECT
id,
`dept-user_0`
FROM
worksheet_data_30 d
WHERE
JSON_CONTAINS( d.`dept-user_0`->'$[*].name' , '"jj"', '$') AND JSON_CONTAINS( d.`dept-user_0`->'$[*].name' , '"亚瑟"', '$')
查询结果如下:

6.以json字段为查询条件[查询JSONObject]类型 [包含特殊符号的KEY的查询,应使用" "双引号扩住]
json字段值如下格式:
{
"input_0":"lio",
"textarea_0":"多行文本",
"input-number_0":"17",
"date_0":"2019-08-07 09:33:06",
"select_0":",张三,李四,王五,",
"area_0":"qwdq4d8q4d8q4wd4",
"location_0":"48444",
"file_0":"451515151",
"dept-user_0":"[{\"id\":\"1\",\"name\":\"jz\"},{\"id\":\"2\",\"name\":\"盖伦\"},{\"id\":\"3\",\"name\":\"jj\"}]",
"dept-base_0":"[{\"id\":\"1\",\"name\":\"pj\"},{\"id\":\"2\",\"name\":\"游侠\"},{\"id\":\"3\",\"name\":\"jj\"}]"
}

查看正常字段,可以这么写:
SELECT
val,
val -> '$.input_0'
FROM
worksheet_data_table_data
WHERE
val -> '$.input_0' like '%o%'

在对于数据库非JSON字段的列名查询,如果有特殊符号的,可以使用``扩住,例如:
SELECT
`col_name`,
val
FROM
worksheet_data_table_data
WHERE
`col_name` = 'table_0'

但在查询JSON字段时候,指定key时有特殊符号,就不能使用`` 反单引号扩住了,而应该采用""双引号 扩住KEY查询:
错误写法:
SELECT
val,
val -> '$.`dept-user_0`'
FROM
worksheet_data_table_data
WHERE
val -> '$.`dept-user_0`' like '%盖伦%'
报错:Invalid JSON path expression. The error is around character position 15.

正确写法:
SELECT
val,
val -> '$."dept-user_0"'
FROM
worksheet_data_table_data
WHERE
val -> '$."dept-user_0"' like '%盖伦%'
结果:

7.以json字段为查询条件[查询JSONObject]类型 [key:value value是时间 的 时间区间和=查询]

【注意:】
对于JSON字符串中的时间格式的存储,需要统一格式,要么都是"%Y-%m-%d" , 要么都是“%Y-%m-%d %H:%i:%s” 或者其他,但只有保证时间存入的格式是一致的,
才能使用 字符串转时间的函数 ,按照统一的时间格式 进行转化,否则转换不成功,即不能准确查询出结果。
STR_TO_DATE(val -> '$.date_0','"%Y-%m-%d %H:%i:%s"')
对于时间的区间查询:[需要在区间结束时间往后算1天,这样才能保证查询的准确性]
SELECT
val,
val -> '$."date_0"'
FROM
worksheet_data_table_data
WHERE
STR_TO_DATE(val -> '$.date_0','"%Y-%m-%d %H:%i:%s"') between '2019-08-07 10:33:06' AND date_add('2019-08-08', interval 1 day)

对于时间的=查询:[其实也是用between and,只不过,区间结束时间往后算1天,这样得到的就是今天到明天之前的所有时间数据]
SELECT
val,
val -> '$."date_0"'
FROM
worksheet_data_table_data
WHERE
STR_TO_DATE(val -> '$.date_0','"%Y-%m-%d %H:%i:%s"') between '2019-08-07 10:33:06' AND date_add('2019-08-07', interval 1 day)

8.以json字段为查询条件[查询JSONObject]类型 [key:value value是数值 的 数值的 区间和=查询]

数值的区间查询【between 或者 > < 都可以】
SELECT
val,
val -> '$."input-number_0"',
CAST(val -> '$."input-number_0"' AS DECIMAL(18,3))
FROM
worksheet_data_table_data
WHERE
CAST(val -> '$."input-number_0"' AS DECIMAL(18,3)) between 16 and 18
SELECT
val,
val -> '$."input-number_0"',
CAST(val -> '$."input-number_0"' AS DECIMAL(18,3))
FROM
worksheet_data_table_data
WHERE
CAST(val -> '$."input-number_0"' AS DECIMAL(18,3)) >16.3

数值=查询
SELECT
val,
val -> '$."input-number_0"',
CAST(val -> '$."input-number_0"' AS DECIMAL(18,3))
FROM
worksheet_data_table_data
WHERE
CAST(val -> '$."input-number_0"' AS DECIMAL(18,3)) =16

【mysql】mysql5.7支持的json字段查询【mybatis】的更多相关文章
- mysql 和mssql2016中的json字段相关操作
Mysql: mysql中有专门的Json字段,不是通用的varchar字段,可以保存key/value对,也可保存value集合. 可以增加.删除.修改Json中的某一字段,查询时可以为条件. 如果 ...
- mysql5.7 新增的json字段类型
一.我们先创建一个表,准备点数据 CREATE TABLE `json_test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'I ...
- mysql中,创建包含json数据类型的表?创建json表时候的注意事项?查询json字段中某个key的值?
需求描述: 在mysql数据库中,创建包含json数据类型的表.记录下,在创建的过程中,需要注意的问题. 操作过程: 1.通过以下的语句,创建包含json数据类型的表 mysql> create ...
- MySQL中JSON字段的使用技巧
mysql5.7.8之后开始原生支持json. 在类似mongodb这种nosql数据库中,json存储数据是非常自然的, 在mysql中合理的使用json,能够带来极大的便利 Json字段的使用场景 ...
- mysql json字段
从 MySQL 5.7.8 开始,MySQL 支持原生的 JSON 数据类型. 一. 创建json(不可以设置长度,可以是null,不能用有默认值) mysql> CREATE TABLE ...
- MySQL全文索引、联合索引、like查询、json查询速度大比拼
目录 查询背景 一.like查询 二.json函数查询 三.联合索引查询 四.全文索引查询 结论 查询背景 有一个表tmp_test_course大概有10万条记录,然后有个json字段叫outlin ...
- Mysql JSON字段提取某一个属性值的函数
mysql从5.7开始才支持JSON_EXTRACT等 JSON相关的函数, 项目里用到的mysql是5.6的,需要提取JSON字段里某一个属性值进行统计, 自己写了一个笨的提取方法: CREATE ...
- mysql update不支持子查询更新
先看示例: SELECT uin,account,password,create_user_uin_tree FROM sys_user 结果: 表中的create_user_uin_tree标识该条 ...
- 关于JSON 字段数据的直接查询
最新的pgSQL 对json的支持在进一步加强!虽然我也学了那么点皮毛,但是json数据对于WEB的开发确实很重要,苦苦学习了很长一段时间,不断的关系PGSQL的动向! 好在翻看很多高人的例子和介绍, ...
随机推荐
- django rest_framework 实现用户登录认证
django rest_framework 实现用户登录认证 1.安装 pip install djangorestframework 2.创建项目及应用 创建过程略 目录结构如图 3.设置setti ...
- Robot Framework常用关键字
虽然通过RIDE提供"填表"一样的写测试用例的方式.但它却支持强大的关键字功能,以及可以开发关键字的扩展能力. Comment 注释功能,也可以使用python中的"#& ...
- apache2.4
介绍 Apache HTTP server是Apache软件基金会的一个开源的网页服务器,可以运行在几乎所有广泛使用的计算机平台上,由于跨平台和安全性被广泛使用,是目前最流行的web服务器软件之一,目 ...
- Linux学习之路-基础入门 20191104
1.计算机组成 2.开发接口标准 ABI--(Application Binary Interface) ABI描述了应用程序与OS之间的底层接口,允许编译好的目标代码在使用兼容ABI的系统中无需改动 ...
- detectron2安装出现Kernel not compiled with GPU support 报错信息
在安装使用detectron2的时候碰到Kernel not compiled with GPU support 问题,前后拖了好久都没解决,现总结一下以备以后查阅. 不想看心路历程的可以直接跳到最后 ...
- load address、entry point、 bootm address以及kernel运行地址
load address:加载地址 load_addr mkimage -a entry point: 入口地址 entry_point mkimage -e bootm ...
- mysql的基本数据类型里几个int如下:TINYINT SMALLINT MEDIUMINT INT或INTEGER BIGINT
mysql的基本数据类型里几个int如下:类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1字节 (-128,127) (0,255) 小整数值 SM ...
- 06-C#笔记-常量
1. 进制 前缀:0x 或 0X 表示十六进制,0 表示八进制,没有前缀则表示十进制. 后缀:可以是 U 或 L 的组合,其中,U 和 L 分别表示 unsigned 和 long.后缀可以是大写或者 ...
- Comet OJ 夏季欢乐赛 完全k叉树
完全k叉树 https://cometoj.com/contest/59/problem/A?problem_id=2712 题目描述 欢迎报考JWJU!这里有丰富的社团活动,比如为梦想奋斗的ACM集 ...
- Python进阶-II 参数陷阱、命名空间、嵌套、作用域、闭包
一.参数陷阱 在使用默认参数时,可能碰见下列情况 def show_args_trap(i, li = []): li.append(100) li[i] = 101 print(li) show_a ...