我正在尝试使用 JSqlParser 从 SQL SELECT 语句中提取表/列列表。SELECT 包含一个计算和一个嵌套的 SELECT:
SELECT col1 AS a, (col2 - col21) AS b, col3 AS c FROM table1
where col1 in (select col4 from table4)
这应该返回:
col1 table1
col2 table1
col21 table1
col3 table1
col4 table4
如果我用 解析它CCJSqlParserUtil
,我会得到不同的东西:
Select stmt = (Select) CCJSqlParserUtil.parse("SELECT col1 AS a, col2 AS b, col3 AS c "
+ "FROM table1 WHERE where col1 in (select col4 from table4)");
Map<String, Expression> map = new HashMap<>();
for (SelectItem selectItem : ((PlainSelect)stmt.getSelectBody()).getSelectItems()) {
selectItem.accept(new SelectItemVisitorAdapter() {
@Override
public void visit(SelectExpressionItem item) {
map.put(item.getAlias().getName(), item.getExpression());
}
});
}
System.out.println("map " + map);
印刷:
map {a=col1, b=col2, c=col3}
这不是我要找的。SELECT 语句甚至可以更复杂,带有嵌套和子嵌套的 SELECT;有没有办法获取所有列/表的列表?