MYSQL JSON数组转置,将JSON数组中内容行转列

情况一:
主表结构:main_table

EMRIDJSON_FIELD
00001[{“CODE”: “A01”, “DISPLAY_TYPE”: 1},{“CODE”: “A02”, “DISPLAY_TYPE”: 2}]
00002[{“CODE”: “A02”, “DISPLAY_TYPE”: 3},{“CODE”: “A03”, “DISPLAY_TYPE”: 4}]
00003{“CODE”: “A03”, “DISPLAY_TYPE”: 5}]

想要的结构

项目CODEDISPLAY_TYPE
00001A011
00001A022
00002A023
00002A034
00003A035

SQL

SELECT
	EMRID,
	t.CODE,
	t.DISPLAY_TYPE
FROM
	main_table,
	json_table (
		JSON_FIELD,
		'$[*]' COLUMNS (
			CODE VARCHAR ( 10 ) path '$.CODE',
			DISPLAY_TYPEVARCHAR ( 10 ) path '$.DISPLAY_TYPE'
		)) t 
-- WHERE DISPLAY_TYPE= '2'  加条件查询

情况二:
主表结构:main_table

EMRIDJSON_FIELD
00001[“a”,“b”,“c”]
00002[“d”,“e”]
00003[“f”]

想要的结构

项目KEY
00001a
00001b
00001c
00002d
00002e
00003f

SQL

SELECT
	EMRID,
	t.v
FROM
	main_table,
	JSON_TABLE(KEY,"$[*]" COLUMNS ( v VARCHAR (128) PATH "$")) t

情况二实际应用:
查找title='张三’的json对象,获取其type值,需要先使用JSON_SEARCH获取title='张三’的路径,再将title替换为type。
由于JSON_SEARCH搜索的结果是个JSON_ARRAY(多个结果),或者字符串(单个结果),如:

select id,
JSON_SEARCH(JSON_EXTRACT(CONTENT, '$.cr[*].r' ), 'all', '张三', NULL, '$[*].title') ta
from table

查询结果:

EMRIDCONTENTta
00001{json数据}“$[1].title”
00002{json数据}[“$[2].title”, “$[13].title”]
00003{json数据}“$[1].title”

进行替换

-- JSON_UNQUOTE是将json_path中的双引号去掉,路径作为参数,不能带双引号
select 
	id,
	JSON_UNQUOTE(
		REPLACE(
			JSON_SEARCH(JSON_EXTRACT(CONTENT, '$.cr[*].r' ), 'all', '张三', NULL, '$[*].title'),'title','type'
		)
	) ta
from table

当JSON_SEARCH参数为ALL时,获取多个数据会自动存为JSON_ARRAY,单个数据为字符串,需要统一转化为JSON_ARRAY,并将title替换为type

select id,CONTENT,jt.v from 
	(select 
		id,CONTENT
		JSON_UNQUOTE(
			REPLACE(
				JSON_SEARCH(JSON_EXTRACT(CONTENT, '$.cr[*].r' ), 'all', '张三', NULL, '$[*].title'),'title','type'
			)
		) ta
	from table) t
-- IF(LEFT(ta,1)='[',ta,CONCAT('[',ta,']'))  是为了统一转为JSON_ARRAY
,JSON_TABLE(IF(LEFT(ta,1)='[',ta,CONCAT('[',ta,']')),"$[*]" COLUMNS ( v VARCHAR (128) PATH "$")) jt

查询结果(ID为00002的JSON_ARRAY被拆为两行):

IDCONTENTv
00001{json数据}“$[1].type”
00002{json数据}“$[2].type”
00002{json数据}“$[13].type”
00003{json数据}“$[1].type”

接下来就可以进行查询了,获取id

select id from 
	(select 
		id,CONTENT
		JSON_UNQUOTE(
			REPLACE(
				JSON_SEARCH(JSON_EXTRACT(CONTENT, '$.cr[*].r' ), 'all', '张三', NULL, '$[*].title'),'title','type'
			)
		) ta
	from table) t
,JSON_TABLE(IF(LEFT(ta,1)='[',ta,CONCAT('[',ta,']')),"$[*]" COLUMNS ( v VARCHAR (128) PATH "$")) jt
where JSON_EXTRACT(t.CONTENT,jt.v)='表格'

具体json字段格式自由发挥吧,由于懒以及公司数据表保密,上述SQL手敲,未运行过,逻辑没问题

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值