alibaba / druid

阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品,为监控而生的数据库连接池
https://github.com/alibaba/druid/wiki
Apache License 2.0
27.97k stars 8.58k forks source link

使用sql parser解析sql时,对于in语句,以及字符串中的值,总是拿不到希望取到的值。 #1907

Open jinkingmanager opened 7 years ago

jinkingmanager commented 7 years ago

待解析的sql: String sql = "select * from filter_obj where name like 'de%' and age > 30 and male = 'male' and id in (2l,3l,4l) order by name desc";

解析代码:

` List filterStatements = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL); Assert.assertEquals(1, filterStatements.size());

// get the only AST SQLStatement statement = Iterables.getOnlyElement(filterStatements); Assert.assertTrue(statement != null);

// SchemaStatVisitor MySqlSchemaStatVisitor mySqlSchemaStatVisitor = new MySqlSchemaStatVisitor(); // accept statement.accept(mySqlSchemaStatVisitor);

// get where conditions List whereConditions = mySqlSchemaStatVisitor.getConditions();

// get order by List orderByFields = mySqlSchemaStatVisitor.getOrderByColumns();`

通过断点查看里面的内容,如下: statement: image

conditions: image

问题: 该如何设置才能拿到statement中一致的内容,如 带引号的值'male',以及in-clause中的值(2l,3l,4l)?

jinkingmanager commented 7 years ago

druid版本号 1.1.2,thx

wenshao commented 7 years ago

能否告知具体使用场景?

jinkingmanager commented 7 years ago

目前在维护一个比较老的系统,数据结构比较复杂,需求又比较多。历史原因上游会直接传递各种sql作为查询条件以查询数据,在数据量比较大,传过来的sql中字段又不是索引的场景下查询效率很慢.

所以想了一个思路,先通过主维度查询数据(主维度可以限定数据量不会太大,最多数百条),然后将上游传来的sql中的where子句 解析成对应表的各种表达式条件,然后通过SQLEvalVisitorUtils.evalExpr 来循环遍历。

目前在解析的时候,就发现in后的value数据 以及字符串类型数据并不能拿到希望的数据。

FYI

jinkingmanager commented 7 years ago

我的sql中存在一些问题,id in (2l,3l,4l),去掉'l'(为long),则id对应的数据识别是OK的。 只是字符串数据单引号的问题,还是需要在SQLEvalVisitorUtils中的getValue()方法改写下,目前已OK。

FYI