mysql5.7支持的json字段查询

参考:https://www.cnblogs.com/ooo0/p/9309277.html

参考:https://www.cnblogs.com/pfdltutu/p/9019444.html

使用示例:

存储结构如下:

1.以json字段作为查询条件:[json字段全部是JSONObject类型的]

  1. SELECT
  2. *
  3. FROM
  4. worksheet_data_table_data w
  5. WHERE
  6. w.val -> '$.input_0' LIKE '%0%'

查询结果:

2.判断JSON字段,是JSONObject类型还是JSONArray类型

  1. SELECT
  2. w.val,
  3. JSON_TYPE( w.val )
  4. FROM
  5. worksheet_data_table_data w

查询结果:

3.查询JSON字段是 Array的JSON类型的

  1. SELECT
  2. w.val,
  3. JSON_TYPE( w.val )
  4. FROM
  5. worksheet_data_table_data w
  6.  
  7. where
  8. JSON_TYPE(w.val) = 'ARRAY'

查询结果:

4.以json字段为查询条件[查询JSONArray]类型  [like查询]

  1. SELECT
  2. *
  3. FROM
  4. worksheet_data_table_data w
  5. WHERE
  6. w.val -> '$[*].*' LIKE '%峰%'

解释:

  1. w.val -> '$[*].*' LIKE '%峰%'
  2.  
  3. 1.w.val字段是JSON数组[无所谓JSONObject还是JSONArray]
  4. [反正如果按照对象查,那数组是匹配不到的]
  5. [反之,如果按照数组查,对象也是匹配不到的]
  6.  
  7. 2.'$[*].*'
  8. 代表查询JSONArray 数组格式的JSON字符串中,
  9. 第一个* 代表任意下标
  10. 第二个* 代表任意属性
  11.  
  12. 3.LIKE '%峰%'
  13. 匹配条件和正常sql 查询条件一样

查询结果如下:

5.以json字段为查询条件[查询JSONArray]类型  [=查询]

等于查询不同于like的查询,需要在外面包裹一层JSON_CONTAINS()

比如数据集如下:

想要 查询 出 name字段  既等于"亚瑟"  又等于"jj"的json字段

  1. SELECT
  2. id,
  3. `dept-user_0`
  4. FROM
  5. worksheet_data_30 d
  6. WHERE
  7. JSON_CONTAINS( d.`dept-user_0`->'$[*].name' , '"jj"', '$')
  8.  
  9. AND
  10.  
  11. JSON_CONTAINS( d.`dept-user_0`->'$[*].name' , '"亚瑟"', '$')

查询结果如下:

6.以json字段为查询条件[查询JSONObject]类型  [包含特殊符号的KEY的查询,应使用" "双引号扩住]

json字段值如下格式:

  1. {
    "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\"}]"
    }

查看正常字段,可以这么写:

  1. SELECT
  2. val,
  3. val -> '$.input_0'
  4. FROM
  5. worksheet_data_table_data
  6. WHERE
  7. val -> '$.input_0' like '%o%'

在对于数据库非JSON字段的列名查询,如果有特殊符号的,可以使用``扩住,例如:

  1. SELECT
  2. `col_name`,
  3. val
  4. FROM
  5. worksheet_data_table_data
  6. WHERE
  7. `col_name` = 'table_0'

但在查询JSON字段时候,指定key时有特殊符号,就不能使用`` 反单引号扩住了,而应该采用""双引号 扩住KEY查询:

错误写法:

  1. SELECT
  2. val,
  3. val -> '$.`dept-user_0`'
  4. FROM
  5. worksheet_data_table_data
  6. WHERE
  7. val -> '$.`dept-user_0`' like '%盖伦%'

报错:Invalid JSON path expression. The error is around character position 15.

正确写法:

  1. SELECT
  2. val,
  3. val -> '$."dept-user_0"'
  4. FROM
  5. worksheet_data_table_data
  6. WHERE
  7. 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天,这样才能保证查询的准确性]

  1. SELECT
  2. val,
  3. val -> '$."date_0"'
  4. FROM
  5. worksheet_data_table_data
  6. WHERE
  7. 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天,这样得到的就是今天到明天之前的所有时间数据]

  1. SELECT
  2. val,
  3. val -> '$."date_0"'
  4. FROM
  5. worksheet_data_table_data
  6. WHERE
  7. 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 或者 > < 都可以】

  1. SELECT
  2. val,
  3. val -> '$."input-number_0"',
  4. CAST(val -> '$."input-number_0"' AS DECIMAL(18,3))
  5. FROM
  6. worksheet_data_table_data
  7. WHERE
  8. CAST(val -> '$."input-number_0"' AS DECIMAL(18,3)) between 16 and 18
  1. SELECT
  2. val,
  3. val -> '$."input-number_0"',
  4. CAST(val -> '$."input-number_0"' AS DECIMAL(18,3))
  5. FROM
  6. worksheet_data_table_data
  7. WHERE
  8. CAST(val -> '$."input-number_0"' AS DECIMAL(18,3)) >16.3

数值=查询

  1. SELECT
  2. val,
  3. val -> '$."input-number_0"',
  4. CAST(val -> '$."input-number_0"' AS DECIMAL(18,3))
  5. FROM
  6. worksheet_data_table_data
  7. WHERE
  8. 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. 轻量级.Net ORM SqlSuger项目实战

    SqlSuger,清垃圾ORM实战例子. //添加引用 using SqlSugar; //在构造函数中实例化SqlSuger clinet = new SqlSugarClient(new Conn ...

  2. nginx 日志问题(\x22)

    nginx 日志问题(\x22) 问题: 1.request_body中含有中文时,nginx日志会转换为十六进制. 2.nginx记录问题 POST /xxxxx HTTP/1.1|200|4266 ...

  3. ActiveMQ消息可靠性-事物

    事物偏生产者,签收偏消费者 设置为true,需要手动提交    设置为false,自动提交   使用手动提交的好处就是可以回滚,当整个事物提交时,里面的某条失败了,可以事物回滚,于是保证了数据的一致性 ...

  4. 仿照addCleanup 在unittest中清理addSetupclass资源

    addCleanup的用例这里不介绍了,可以看我的另一编文章: python unittest框架中addCleanup函数详解 但如果有下面这种场景,还是会遗留大批理资源 在setUpClass注入 ...

  5. Comet OJ 夏季欢乐赛 距离产生美

    距离产生美 https://cometoj.com/contest/59/problem/B?problem_id=2680 题目描述 JWJU放暑假了,于是鸡尾酒就和女朋友璇璇一起出去玩.但是外面太 ...

  6. JS中把其他类型转换成字符串的三种方法

    1.toString()方法 toString()方法返回的是相应值的字符串表现 数值.布尔值.对象和字符串值都有toString()方法,但是null和undefined值没有这个方法 例子: va ...

  7. 2.1 自动内存管理机制--Java内存区域与内存溢出异常

    自动内存管理机制 第二章.Java内存区域与内存溢出异常 [虚拟机中内存如何划分,以及哪部分区域.什么样代码和操作会导致内存溢出.各区域内存溢出的原因] 一.运行时数据区域 Java虚拟机所管理的内存 ...

  8. Excel-自定义单元格、填充柄

    数据分析是指用适当的统计分析方法对收集来的大量数据进行分析, 提取有用信息和形成结论而对数据加以详细研究和概括总结的过程. 工具:EXCEL,sql,SAS,SPSS,R,Python.Hadoop. ...

  9. 26 配置TensorFlow 1.9

    https://www.ctolib.com/topics-133854.html sudo apt install libatlas-base-dev pip3 install tensorflow ...

  10. EasyUI前后端分离

    陈旧的开发模式 美工(ui工程师:出一个项目模型) java工程师:将原有的html转成jsp,动态展示数据 缺点: 客户需要调节前端的展示效果 解决:由美工去重新排版,重新选色.Vs前后端分离 美工 ...