【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的动向! 好在翻看很多高人的例子和介绍, ...
随机推荐
- yaml格式配置文件
YAML 是一种可读性非常高,与程序语言数据结构非常接近.同时具备丰富的表达能力和可扩展性,并且易于使用的数据标记语言. python中处理 Yaml 格式的数据需要先下载pyyaml: pip in ...
- Django框架(四)-- 路由控制:有名/无名分组、反向解析、路由分发、名称空间、伪静态、APPEND_SLASH、不同版本的Django区别、Django虚拟环境搭建
路由控制 一.简单路由配置 url(r'^booklist$', views.booklist) 第一个参数是正则表达式,第二个参数是视图函数 每个正则表达式前面的'r' 是可选的但是建议加上.它告诉 ...
- ajax jQ写的上传进度条
XML/HTML Code <form id="myForm" action="upload.php" method="post" e ...
- Python基础之while和for
实现ATM的输入密码重新输入的功能 while True: user_db = 'nick' pwd_db = '123' inp_user = input('username: ') inp_pwd ...
- 【java异常】Parsing error was found in mapping #{}. Check syntax #{property|(expression), var1=value1, var2=val
在增删改查的过程中有一个#{ }没有填写
- 梅尔倒谱系数特征(Mel-frequency cepstral coefficients,MFCC)
引言 感知实验表明,人耳对于声音信号的感知聚焦于某一特定频率区域内,而非在整个频谱包络中. MFCC特征是应用非常广泛的语音特征. 语音的MFCC特征是基于人耳感知实验得到,将人耳当成特定的滤波器,只 ...
- 记录Windows下文件操作记录
https://blog.csdn.net/huashuolin001/article/details/73863324
- [RN] React Native 让 Flatlist 支持 选中多个值,并获取所选择的值
React Native 让 Flatlist 支持 选中多个值,并获取所选择的值 实现效果如下: 实现代码: import React, {Component} from 'react'; im ...
- 字符串的方法slice、substr、substring对比
三个方法的参数1都代表子串开始位置,参数2在slice和substring中表示结束位置,而在substr中代表的则是子串长度: 对于负数态度,当出现在参数1的位置时,slice和substr从末尾开 ...
- 获取DOM元素的方式有哪些
document.getElementById();//id名 document.getElementsByTagName();//标签名 document.getElementsByClassNam ...