请帮忙解决CCJSqlParser问题

时间:2015-02-08 15:27:27

标签: jsqlparser

我使用下面的代码来获取所选列。但是在列项中,为什么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());

            }
        }

1 个答案:

答案 0 :(得分:0)

这不是问题,而是正常的JSqlParser行为。 JSqlParser为您提供了一种结构化的方式来查看您的SQL但不进行语义处理。它是一个解析器。

因此,对于列,tablename在您的示例中确实是别名。 JSqlParser不会将此别名解析为实际表名。您必须处理from项目以将表名称作为别名并将其映射到列。

恕我直言,您应该按照TableNamesFinder的路径构建一个提取列的访问者,并获取包含名称和别名的表格。您必须小心只使用在列上下文中有效的表,例如

select data.a from (select a from mydata) as data 

此处数据是subsql的别名,而不是表的别名。