在不支持JSON解析函数的MySql版本提取json字段

68 阅读1分钟
  1. 前置条件:json格式字符串必须是紧凑的才便于操作
    • 案例json字符串: {"id":0,"code":"CODE","name":"NAME"},从其中提取出$.code
  2. 通过REGEXP_SUBSTR函数定位要提取的json的key-value
    • REGEXP_SUBSTR('{"id":0,"code":"CODE","name":"NAME"}', '"code":"[^"]+')即匹配了"code":"CODE",并提取出了"code":"CODE(不提取最后一个引号是为了简化操作)
  3. 通过SUBSTRING函数截取json值
    • SUBSTRING('"code":"CODE',length('"code":"')+1)截取出CODE
  4. 完整的案例:
    • 提取字符串:SELECT SUBSTRING(REGEXP_SUBSTR('{"id":0,"code":"CODE","name":"NAME"}', '"code":"[^"]+'),length('"code":"')+1) as json_val将得到结果CODE,正常提取出想要的值,可以总结成一个简单的mybatis: SELECT SUBSTRING(REGEXP_SUBSTR(field, '"${key}":"[^"]+'),length('"${key}":"')+1) as field_val,${key}即将要查询的kv
    • 提取数字:SELECT SUBSTRING(REGEXP_SUBSTR('{"id":0,"code":"CODE","name":"NAME"}', '"id":[^,]+'),length('"id":')+1) as json_val将得到结果0,正常提取出想要的值
  5. 对于复杂的json结构,则不可以使用这个简单的方式,需要通过REGEXP_SUBSTR进行复杂层级解析,开销较大,实际情况中不建议
    • js正则样例: 从{"address":{"city":"CQ"}}提取$.address.city则需要/"address\"\s*:\s*\{[^{}]*\"city\"\s*:\s*\"([^\"]+)\"/.exec(s)[1]才能提取出CQ,且仅能提取首次匹配值,无法遍历同名键