数据大致格式如下,需求:
求当前公司等于P的角色(JSON中的R字段)
company_name | case_role |
---|---|
江苏XXXX集团有限公司 | [{"P":"张三","R":"申请执行人","ShowName":"张三","N":"","O":-2},{"P":"江苏XXXX集团有限公司","R":"被执行人","ShowName":"江苏XXXX集团有限公司","N":"00300fef44ee8d7cee7aa43ba0def3c8","O":0}] |
case_role格式化后
[{
"P": "张三",
"R": "申请执行人",
"ShowName": "张三",
"N": "",
"O": -2
}, {
"P": "江苏XXXX集团有限公司",
"R": "被执行人",
"ShowName": "江苏XXXX集团有限公司",
"N": "00300fef44ee8d7cee7aa43ba0def3c8",
"O": 0
}]
要实现需求必须JSON与JSON之间能够切割,但是目前JSON间是逗号不能直接Split(case_role,','),将case_role转成
{
"P": "张三",
"R": "申请执行人",
"ShowName": "张三",
"N": "",
"O": -2
}; {
"P": "江苏XXXX集团有限公司",
"R": "被执行人",
"ShowName": "江苏XXXX集团有限公司",
"N": "00300fef44ee8d7cee7aa43ba0def3c8",
"O": 0
}
这样进行Split(case_role,';')后使用get_json_object取对应字段即可
第一步转换:
explode(split(regexp_replace(regexp_replace(case_role, '\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{'),'\\;')) as case_role
regexp_replace(case_role, '\\[|\\]','')去掉[]
regexp_replace(regexp_replace(case_role, '\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{')
将JSON间的逗号替换成;
第二步取值
get_json_object(a.case_role,'$.R') as case_role
最终SQL
select
a.company_name
,get_json_object(a.case_role,'$.R') as case_role
from
(
SELECT
,company_name
,explode(split(regexp_replace(regexp_replace(case_role, '\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{'),'\\;')) as case_role
FROM qcc
) a
WHERE get_json_object(a.case_role,'$.P')=a.company_name
当然也可以使用正则,能解决问题就好
网友评论