mysql【8.0版本】JSON_TABLE,json转换为表的使用

JSON_TABLE 是mysql8.0版本后支持的函数,用于将json字符串映射为mysql的表

JSON_TABLE 实战

// table1.jsonFiled   = ["1000000000000191","1000000000000192","1000000000000193","1000000000000194"]
SELECT
	GROUP_CONCAT(table2.filedName SEPARATOR '; ') Names
from
	JSON_TABLE(table1.jsonFiled , "$[*]" COLUMNS(
			m1 varchar(40) PATH "$" 
		)
	) as aaaa

解释:该段sql表示将table1中的jsonFiled字段值映射为aaaa表,并将值映射在aaaa表中的m1字段。

JSON_TABLE(
    expr,
    path COLUMNS (column_list)
)   [AS] alias

column_list:
    column[, column][, ...]

column:
    name FOR ORDINALITY
    |  name type PATH string path [on_empty] [on_error]
    |  name type EXISTS PATH string path
    |  NESTED [PATH] path COLUMNS (column_list)

on_empty:
    {NULL | DEFAULT json_string | ERROR} ON EMPTY

on_error:
    {NULL | DEFAULT json_string | ERROR} ON ERROR

该段是mysql官网给出的关于JSON_TABLE的使用和解释

结合官网给出实例分析

mysql> SELECT *
    -> FROM
    ->   JSON_TABLE(
    ->     '[{"x":2,"y":"8"},{"x":"3","y":"7"},{"x":"4","y":6}]',
    ->     "$[1]" COLUMNS(
    ->       xval VARCHAR(100) PATH "$.x",
    ->       yval VARCHAR(100) PATH "$.y"
    ->     )
    ->   ) AS  jt1;

+------+------+
| xval | yval |
+------+------+
| 3    | 7    |
+------+------+

JSON_TABLE : json转table的函数
[{“x”:2,“y”:“8”},{“x”:“3”,“y”:“7”},{“x”:“4”,“y”:6}] : 这串是给出的json字符串示例
$[1] : 表示获取这个json结合中下表为1位置的对象进行解析
[ ∗ ] :表示解析全部 j s o n 串信息 C O L U M N S :表示解析 j s o n 串映射的字段描述 x v a l :表示自定义字段名 x v a l V A R C H A R ( 100 ) P A T H " [*] : 表示解析全部json串信息 COLUMNS : 表示解析json串映射的字段描述 xval : 表示自定义字段名 xval VARCHAR(100) PATH " []:表示解析全部json串信息COLUMNS:表示解析json串映射的字段描述xval:表示自定义字段名xvalVARCHAR(100)PATH".x", : 表示xval字段类型为VARCHAR,字段值最大长度为100 ,PATH是固定格式,$.x 表示 xval对应的就是json字符串对象中的x字段。
AS jt1 : 表示给映射的表起个名字,叫jt1。
名字和字段都可以随便取。

JSON_TABLE的官网使用说明

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
上面的优化方案已经使用JSON_TABLE() 函数将原始数据从 JSON 格式中提取出来,并插入到 log 表中。但是,如果表中有大量的字段,手动指定每一个字段是比较麻烦的,而且容易出错。 为了更好地优化这个 INSERT 语句,我们可以使用 MySQL 8.0 引入的 INFORMATION_SCHEMA.COLUMNS 表来获取目标表的所有列名,然后使用动态 SQL 语句构造 JSON 对象。这样可以避免手动指定每一个字段,提高代码的可读性和可维护性。 例如,我们可以将上面的 INSERT 语句优化为: ``` SET @sql = CONCAT( 'INSERT INTO log (table_name, action_type, old_data, new_data) ', 'SELECT ''target_table'', ''UPDATE'', old_data, new_data ', 'FROM JSON_TABLE(', ' JSON_OBJECT(', ' ''old_data'', JSON_OBJECT(', (SELECT GROUP_CONCAT(CONCAT(' ''', column_name, ''', OLD.', column_name) SEPARATOR ',\n') FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'target_table'), ' ),', ' ''new_data'', JSON_OBJECT(', (SELECT GROUP_CONCAT(CONCAT(' ''', column_name, ''', NEW.', column_name) SEPARATOR ',\n') FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'target_table'), ' )', ' ),', ' ''$.*'' COLUMNS(', ' old_data JSON PATH ''$.old_data'',', ' new_data JSON PATH ''$.new_data''', ' )', ') AS t;' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; ``` 这个语句中,我们使用 INFORMATION_SCHEMA.COLUMNS 表获取目标表的所有列名,并使用 GROUP_CONCAT() 函数将列名拼接为一个字符串。然后,使用 CONCAT() 函数构造 JSON 对象,并将其动态插入到 INSERT 语句中。最后,使用 PREPARE 和 EXECUTE 语句执行动态 SQL 语句。 这样,就可以避免手动指定每一个字段,提高代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值