【问题标题】:Apache Calcite to Find Selected Columns in an SQL StringApache Calcite 在 SQL 字符串中查找选定的列
【发布时间】:2017-06-12 20:31:57
【问题描述】:

我有一个用例,我想知道在 SQL 字符串中选择的列。例如,如果 SQL 是这样的:
SELECT name, age*5 as intelligence FROM bla WHERE bla=bla
然后,在解析完上面的字符串后,我只想输出:name, intelligence.
首先,通过方解石可以吗?
也欢迎任何其他选择。

PS:我想在实际对数据库运行查询之前了解这一点。

【问题讨论】:

    标签: java apache-calcite sql-parser


    【解决方案1】:

    这对于 Calcite 来说绝对是可行的。您首先要创建SqlParser 的实例并解析查询:

    SqlParser parser = SqlParser.create(query)
    SqlNode parsed = parser.parseQuery()
    

    从那里,您可能会最成功地实现SqlVisitor 接口。您需要先找到一个 SqlSelect 实例,然后通过对 getSelectList 的每个元素调用 visit 来访问每个被选中的表达式。

    从那里开始,您如何进行将取决于您要支持的表达式的复杂性。但是,递归访问所有 SqlCall 节点及其操作数然后收集您看到的任何 SqlIdentifier 值可能就足够了。

    【讨论】:

    • 你能只解析部分sql表达式吗?例如解析SUM(amount)/Count(id)。我可以制作虚拟 sql,但如果能够解析由 sql 函数组成的有效 sql 表达式,那就太好了。
    • 对于这种情况,您应该可以使用SqlParserparseExpression 方法。
    【解决方案2】:

    可以这么简单:

    SqlParser parser = SqlParser.create(yourQuery);
    SqlSelect selectNode = (SqlSelect) parser.parseQuery();
    SqlNodeList list = selectNode.getList();
    
    for (int i = 0; i < list.size(); i++) {
        System.out.println("Column " + (i + 1) + ": " + list.get(i).toString());
    }
    

    【讨论】:

      猜你喜欢
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-27
      • 2021-11-10
      • 1970-01-01
      • 2019-11-13
      • 2018-01-02
      相关资源
      最近更新 更多