数据库 | json_remove()函数在不同数据库的区别

今天遇到一个问题,在执行select操作时报错,排查出来是json_remove()函数在不同数据库有区别。

描述

sql语句是:
select json_data, json_remove(json_data,'$.data') AS json_remove from table_xxx
查询一个json结构的数据。

在Java中,使用List<Map<String, Object>>类型接查询结果,然后做后续操作。

问题

部分测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
Map<String, String> type = new HashMap();
for (Map<String, Object> map : list) {
Object jsonDateObject = map.get("json_data");
if (jsonDateObject instanceof String) {
type.put("jsonDate", "String");
} else if (jsonDateObject instanceof byte[]) {
type.put("jsonDate", "byte[]");
} else {
type.put("jsonDate", "other");
}
Object jsonRemoveObject = map.get("json_remove");
if (jsonRemoveObject instanceof String) {
type.put("jsonRemove", "String");
} else if (jsonRemoveObject instanceof byte[]) {
type.put("jsonRemove", "byte[]");
} else {
type.put("jsonRemove", "other");
}
break;
}
String v = "";
sql = "select VERSION() as v";
list = luckySheetJdbcTemplate.queryForList(sql);
for (Map<String, Object> map : list) {
Object vObject = map.get("v");
v = vObject.toString();
}
type.put("dbVersion", v);
return type.toString();

在不同数据库上的查询结果:
MariaDb:

1
2
3
4
5
{
"dbVersion": "10.3.23-MariaDB-0+deb10u1",
"jsonData": "String",
"jsonRemove": "byte[]"
}

MySQL:

1
2
3
4
5
{
"dbVersion": "5.7.26",
"jsonData": "String",
"jsonRemove": "String"
}

TdSQL:

1
2
3
4
5
{
"dbVersion": "5.7.35-V2.0R681D005-v17-20210125-2111-log",
"jsonData": "String",
"jsonRemove": "String"
}

结论

通过测试,json_remove()函数在不同数据库的返回值类型是有区别的,在工程中需要注意。