Пожалуйста, помогите для проблемы CCJSqlParser
Я использую код ниже, чтобы получить выбранные столбцы. Но в элементе столбца почему 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 ответ
Это не проблема, а нормальное поведение JSqlParser. JSqlParser дает вам структурированный способ взглянуть на ваш SQL, но не выполняет семантической обработки. Это парсер.
Поэтому для столбца имя таблицы в вашем примере действительно является псевдонимом. JSqlParser не разрешает этот псевдоним для реального имени таблицы. Вы должны обработать элементы from, чтобы получить имена таблиц, их псевдонимы и сопоставить их с вашими столбцами.
ИМХО, вы должны следовать по пути TableNamesFinder, чтобы создать посетителя, который извлекает ваши столбцы и дополнительно получает ваши таблицы, включая имя и псевдоним. Вы должны быть осторожны, чтобы использовать только те таблицы, которые действительны в контексте ваших столбцов, например
select data.a from (select a from mydata) as data
Здесь данные являются псевдонимом для subql, а не для таблицы.