0

我们是一个数据仓库开发团队,我们的大部分 ETL 逻辑都可以表示为一系列 SQL 选择语句。我正在寻找一种通过解析查询以结构化方式提取数据沿袭的工具。

查询和简化的沿袭输出如下所示:

询问:

SELECT A AS COLUMN_1, B AS COLUMN_2, A+B AS COLUMN_SUM FROM MYTABLE;

输出

COLUMN_1: MYTABLE.A
COLUMN_2: MYTABLE.B
COLUMN_3: MYTABLE.A
COLUMN_3: MYTABLE.B

JSQLParser 是用于此目的的好工具吗?任何有关如何使用该工具的指示或经验也将不胜感激。

4

1 回答 1

1

JSqlParser进行解析并为您提供一种结构化的方式来查看您的 SQL。顺便说一句,JSqlParser在这方面做得很好。

但它不知道您的数据库模式,因此它无法知道 column_1 A 是否来自表 MYTABLE。一个更明显的例子是

select a, b from table1, table2

这些知识必须由您以某种方式注入:)。

要进行简单的解析,请执行以下操作

Statement statement = CCJSqlParserUtil.parse(sql);

要提取使用的列,您可以使用 JSqlParser 提供的 TablesNamesFinder 实用程序,例如

Select selectStatement = (Select) statement;
TablesNamesFinder tablesNamesFinder = new TablesNamesFinder() {
      @Override
      public void visit(Column tableColumn) {
           System.out.println(tableColumn);
      }
};
System.out.println(" and tables=" + tablesNamesFinder.getTableList(selectStatement));

如您所见,浏览数据的一种方法是某种访问者模式。

如果您有更多问题,请随时使用 JSqlParsers gitter room 或在 github 上提交问题。

于 2018-02-02T07:25:54.523 回答