我使用下面的代码来获取所选列。但是在列项中,为什么table.getName()是别名t1或t2而table.getAlias()是null?
是否有任何示例代码同时获取表名(Spark_Test_1,Spark_Test_2)和别名表名(t1,t2)?
String sql = "SELECT t1.AsOfD,t1.ValidD,t1.urn,t1.Money FROM Spark_Test_1 as t1 join Spark_Test_2 as t2 on ( t1.AsOfD = t2.AsOfD)";
Statement statement = CCJSqlParserUtil.parse(sqlStr);
Select selectStatement = (Select) statement;
for (int i = 0; i < size; i++) {
Expression expression = ((SelectExpressionItem) selectitems.get(i))
.getExpression();
//System.out.println("Expression:" + expression);
if(expression instanceof Column){
Column col = (Column) expression;
Table table = col.getTable();
logger.info(table.getFullyQualifiedName());
logger.info(table.getAlias());
logger.info(table.getName());
}
}
答案 0 :(得分:0)
这不是问题,而是正常的JSqlParser行为。 JSqlParser为您提供了一种结构化的方式来查看您的SQL但不进行语义处理。它是一个解析器。
因此,对于列,tablename在您的示例中确实是别名。 JSqlParser不会将此别名解析为实际表名。您必须处理from项目以将表名称作为别名并将其映射到列。
恕我直言,您应该按照TableNamesFinder的路径构建一个提取列的访问者,并获取包含名称和别名的表格。您必须小心只使用在列上下文中有效的表,例如
select data.a from (select a from mydata) as data
此处数据是subsql的别名,而不是表的别名。