Open jinkingmanager opened 7 years ago
druid版本号 1.1.2,thx
能否告知具体使用场景?
目前在维护一个比较老的系统,数据结构比较复杂,需求又比较多。历史原因上游会直接传递各种sql作为查询条件以查询数据,在数据量比较大,传过来的sql中字段又不是索引的场景下查询效率很慢.
所以想了一个思路,先通过主维度查询数据(主维度可以限定数据量不会太大,最多数百条),然后将上游传来的sql中的where子句 解析成对应表的各种表达式条件,然后通过SQLEvalVisitorUtils.evalExpr 来循环遍历。
目前在解析的时候,就发现in后的value数据 以及字符串类型数据并不能拿到希望的数据。
FYI
我的sql中存在一些问题,id in (2l,3l,4l),去掉'l'(为long),则id对应的数据识别是OK的。 只是字符串数据单引号的问题,还是需要在SQLEvalVisitorUtils中的getValue()方法改写下,目前已OK。
FYI
待解析的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:
conditions:
问题: 该如何设置才能拿到statement中一致的内容,如 带引号的值'male',以及in-clause中的值(2l,3l,4l)?