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】的更多相关文章

  1. mysql 和mssql2016中的json字段相关操作

    Mysql: mysql中有专门的Json字段,不是通用的varchar字段,可以保存key/value对,也可保存value集合. 可以增加.删除.修改Json中的某一字段,查询时可以为条件. 如果 ...

  2. mysql5.7 新增的json字段类型

    一.我们先创建一个表,准备点数据 CREATE TABLE `json_test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'I ...

  3. mysql中,创建包含json数据类型的表?创建json表时候的注意事项?查询json字段中某个key的值?

    需求描述: 在mysql数据库中,创建包含json数据类型的表.记录下,在创建的过程中,需要注意的问题. 操作过程: 1.通过以下的语句,创建包含json数据类型的表 mysql> create ...

  4. MySQL中JSON字段的使用技巧

    mysql5.7.8之后开始原生支持json. 在类似mongodb这种nosql数据库中,json存储数据是非常自然的, 在mysql中合理的使用json,能够带来极大的便利 Json字段的使用场景 ...

  5. mysql json字段

    从 MySQL 5.7.8 开始,MySQL 支持原生的 JSON 数据类型.   一. 创建json(不可以设置长度,可以是null,不能用有默认值) mysql> CREATE TABLE ...

  6. MySQL全文索引、联合索引、like查询、json查询速度大比拼

    目录 查询背景 一.like查询 二.json函数查询 三.联合索引查询 四.全文索引查询 结论 查询背景 有一个表tmp_test_course大概有10万条记录,然后有个json字段叫outlin ...

  7. Mysql JSON字段提取某一个属性值的函数

    mysql从5.7开始才支持JSON_EXTRACT等 JSON相关的函数, 项目里用到的mysql是5.6的,需要提取JSON字段里某一个属性值进行统计, 自己写了一个笨的提取方法: CREATE ...

  8. mysql update不支持子查询更新

    先看示例: SELECT uin,account,password,create_user_uin_tree FROM sys_user 结果: 表中的create_user_uin_tree标识该条 ...

  9. 关于JSON 字段数据的直接查询

    最新的pgSQL 对json的支持在进一步加强!虽然我也学了那么点皮毛,但是json数据对于WEB的开发确实很重要,苦苦学习了很长一段时间,不断的关系PGSQL的动向! 好在翻看很多高人的例子和介绍, ...

随机推荐

  1. 本机安装mysql步骤

    原文:https://www.cnblogs.com/dukeShi/p/6546024.html 本机安装mysql服务,步骤教程(另附SQLyog和Navicat工具) 因为这段时间不是装系统就是 ...

  2. Mybatis 子查询

    在查询数据库时,需要以查询结果为查询条件进行关联查询. 在mybatis中通过association标签和collection标签实现子查询. 1. collection(集合)和associatio ...

  3. Linux服务管理之DHCP

    1.DHCP服务简介 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络 ...

  4. MySQL字符集、information_schema元数据(八)

    一.SQL字符集 它是一个系统支持的所有抽象字符的集合.字符是各种文字和符号的总称,包括各国家的文字.标点符号.图形符号.数字等 常用的字符集有:utf8.utf8mb4.utf8mb3(8.0),现 ...

  5. 在CentOS7.5上安装Docker,在Docker中拉取CentOS7.5镜像并安装SSH服务

    # 安装docker yum install -y docker # 启动docker systemctl start docker # 加入开机启动 systemctl enable docker ...

  6. nginx在linux下安装(源码编译)

    下载 http://nginx.org/en/download.html 安装 安装依赖 yum -y install gcc gcc-c++ zlib zlib-devel pcre-devel o ...

  7. ubuntu gitclone下载的文件放哪里了

    在home主文件夹里面.

  8. go安装及使用

    一.安装 Windows直接使用 MSI installer . 默认安装目录为 C:\Go,回自动配置好环境变量. 并默认设置工作目录为:C:\Users\用户名\go 二.使用 在默认的工作目录下 ...

  9. SpringBoot如何切换Redis默认库

    一些闲扯的话 我们清楚,Redis 尽管提供了 16 个索引库,但是每个数据库之间是隔离互不共享的,客户端默认连接使用的是 0 号数据库 . 注意:上方情况是基于单机 Redis 的,在集群模式下是没 ...

  10. opencv获取网络相机的图像-不用sdk

    海康相机 优点:不用sdk直接网络获取 缺点:速度有1-2秒的延迟 使用型号 1280*680分辨路 #include <iostream> #include<opencv2/ope ...