0

我使用下面的代码来获取选定的列。但是在列项中,为什么 table.getName() 是别名 t1 或 t2 而 table.getAlias() 为空?

是否有任何示例代码可以同时获取表名(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());

            }
        }
4

1 回答 1

0

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

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

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

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

这里data是 subsql 的别名,而不是表的别名。

于 2015-03-19T13:45:07.977 回答