用catalog + JSON_EXTRACT 查询 mysql的时,不能用where 条件过虑

Viewed 17

doris 版本:2.1.5
mysql:5.7.30
在使用 catalog 查询 mysql中的的表时,使用 json_extract 抽取 text 字段类型的 数组数据,如:['xxx','xxxx'],如果把 json_extract 放在 where 条件中,则不能返回任何数据,如下:
select id, JSON_UNQUOTE(JSON_EXTRACT(key_names, '$.[0]')), JSON_EXTRACT(key_names, '$.[1]') from catalog1.schema1.table1
where JSON_UNQUOTE(JSON_EXTRACT(key_names, '$.[0]')) = 'xxx'
如果不加where 条件,则可以正常的返回结果集。
总结:
1、使用 catalog 连接 远端的 mysql
2、使用 JSON_EXTRACT
3、把 JSON_EXTRACT 抽取后形成的新字段 放入 where 子句中
同时满足以上 3 个条件,则不能返回任何数据。
如果不使用 catalog 则可以正常返回:同样的方式查询内部表,可以正常返回

2 Answers

方便提供一下catalog创建语句以及mysql表结构、几条数据和查询语句吗,更新在提问内容中即可。

CREATE CATALOG xxxxxx PROPERTIES (
"user" = "doris_data_sync",
"use_meta_cache" = "false",
"type" = "jdbc",
"password" = "*XXX",
"jdbc_url" = "jdbc:mysql://172.xx.xxx.xx:3306/sisyapp_v1?yearIsDateType=false&tinyInt1isBit=false&useUnicode=true&rewriteBatchedStatements=true&characterEncoding=utf-8",
"driver_url" = "mysql-connector-java-8.0.25.jar",
"driver_class" = "com.mysql.cj.jdbc.Driver"
);

CREATE TABLE test4 (
id int(11) NOT NULL,
name varchar(50) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

with
station as (
select id, JSON_UNQUOTE(JSON_EXTRACT(name, '$.[0]')) station_code, JSON_UNQUOTE(JSON_EXTRACT(name, '$.[1]')) create_date
from biz_sys_all_mysql.test_db.test4
)
select * from station
where station_code = 'LGDA01'

image.png

还发现一个现像:如果在 子查询中加入 limit 则能正常返回,如下:
with
station as (
select id, JSON_UNQUOTE(JSON_EXTRACT(name, '$.[0]')) station_code, JSON_UNQUOTE(JSON_EXTRACT(name, '$.[1]')) create_date
from biz_sys_all_mysql.test_db.test4 limit 10
)
select * from station
where station_code = 'LGDA01'