2015-02-08 94 views
0

我使用下面的代碼來獲取選定的列。但是在列項中,爲什麼table.getName()是別名t1或t2而table.getAlias()是null?請幫助CCJSqlParser問題

是否有任何示例代碼在同一時間獲取表名(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

這不是問題,但正常的JSqlParser行爲。 JSqlParser爲您提供了一種結構化的方式來查看您的SQL,但沒有語義處理。它是一個解析器。

因此,對於列中的表名在您的示例中確實是別名。 JSqlParser不會將此別名解析爲真實的表名。您必須處理來自項目的項目以獲取其別名並將其映射到您的列。

恕我直言,你應該按照TableNamesFinder的路徑建立一個訪問者,提取你的列和額外的獲取你的表,包括名稱和別名。您必須小心使用僅在列上下文中有效的表,例如

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

這裏數據爲subsql爲表的別名,而不是。