.. _mysql_query_json:
=======================
MySQL查询JSON
=======================
.. note::
本文是一个实践案例,更为详细的MySQL JSON数据处理,请参考 :ref:`using_json_in_mariadb`
JSON数据
===========
在生产环境中,应用数据交换往往会采用 :ref:`json` 进行。这些交换数据可能会存放在数据库中,形成一条JSON(字段)记录,例如:
.. literalinclude:: mysql_query_json/alert.json
:language: json
:caption: MySQL记录中的JSON数据记录举例
这里有一个问题,我们的告警记录会合并多条相同告警到一个JSON记录中,对于后期统计报表(从mysql查询),我们实际上只关注这个JSON数组中第一个值(后面都是重复的)
.. note::
如果使用阿里云的 :ref:`maxcompute` ODPS SQL 支持 :ref:`odps_sql_json` ,也有类似函数 ``json_extract``
测试数据
==========
我采用 `How to Query JSON column in MySQL `_ 案例来学习实践:
- 先快速 :ref:`install_mariadb` ,初始化一个简单的测试数据库
- 创建一个 ``json`` 字段的:
.. literalinclude:: mysql_query_json/create_json_table
:language: sql
:caption: 创建包含 ``json`` 数据的简单表
- 插入数据库测试数据:
.. literalinclude:: mysql_query_json/insert_json_table
:language: sql
:caption: 插入测试数据
.. note::
这里我遇到一个 :ref:`using_json_in_mariadb` 相关的报错 :ref:`mariadb_error_4025_constraint_fail` ,原因是 `How to Query JSON column in MySQL `_ 提供的SQL源代码有一些格式错误( :ref:`json` 的object形式需要通过 ``,`` 分隔每个键值 ),我通过 :ref:`jq` 工具检查和校对(上文代码已经修正)
- 查询插入的json数据:
.. literalinclude:: mysql_query_json/select_json_table
:language: sql
:caption: 查询json测试数据
输出如下:
.. literalinclude:: mysql_query_json/select_json_table_output
:caption: 查询json测试数据输出结果
一切就绪,我们开始尝试检索(retrieve) JSON字段数据
``JSON_EXTRACT`` 函数
=========================
从MySQL version >= 5.7 开始,提供了 ``JSON_EXTRACT`` 函数可以用来检索JSON数据:
.. literalinclude:: mysql_query_json/json_extract
:language: sql
:caption: 使用 ``JSON_EXTRACT`` 函数检索JSON
此时就会看到提取出对应 ``key`` 的 ``value`` :
.. literalinclude:: mysql_query_json/json_extract_output
:caption: 使用 ``JSON_EXTRACT`` 函数检索JSON输出案例
处理array
------------
回到本文开头提到的告警数据,是一个 :ref:`json` 的array结构:
.. literalinclude:: mysql_query_json/alert.json
:language: json
:caption: MySQL记录中的JSON数据记录举例
对于这个案例,我需要提取出 array[0] 中的object的键值,则在 ``JSON_EXTRACT`` 函数中使用 ``$[index].key`` 方式,也就是先指定数组下标(array index),然后再取出key对应的value。这样语句就是:
.. literalinclude:: mysql_query_json/json_extract_array
:language: sql
:caption: 使用 ``JSON_EXTRACT`` 函数检索JSON的array
参考
======
- `How to search JSON data in MySQL? `_
- `How To Work with JSON in MySQL `_
- `How to Query JSON column in MySQL `_
- `MySQL 8.0 Reference Manual >> Functions That Search JSON Values `_