Пожалуйста, помогите для проблемы 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, а не для таблицы.

Другие вопросы по тегам