我有一个用例,我想知道在SQL字符串中选择的列。例如,如果SQL是这样的:SELECT name, age*5 as intelligence FROM bla WHERE bla=bla然后,在解析了上面的String之后,我只希望输出为:name, intelligence。第一,是否可以通过方解石?任何其他选择也是受欢迎的。PS:我想在实际运行数据库查询之前知道这一点。
SELECT name, age*5 as intelligence FROM bla WHERE bla=bla
name, intelligence
goqiplq21#
这是绝对可行的方解石。首先创建一个SqlParser示例并解析查询:
SqlParser
SqlParser parser = SqlParser.create(query) SqlNode parsed = parser.parseQuery()
从这里开始,您可能会最成功地实现SqlVisitor接口。首先需要找到一个SqlSelect示例,然后通过对getSelectList的每个元素调用visit来访问所选择的每个表达式。从那里开始,如何继续将取决于您想要支持的表达式的复杂性。但是,递归地访问所有SqlCall节点及其操作数,然后收集您看到的任何SqlIdentifier值可能就足够了。
SqlVisitor
SqlSelect
getSelectList
SqlCall
SqlIdentifier
sf6xfgos2#
它可以简单到:
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()); }
2条答案
按热度按时间goqiplq21#
这是绝对可行的方解石。首先创建一个
SqlParser
示例并解析查询:从这里开始,您可能会最成功地实现
SqlVisitor
接口。首先需要找到一个SqlSelect
示例,然后通过对getSelectList
的每个元素调用visit来访问所选择的每个表达式。从那里开始,如何继续将取决于您想要支持的表达式的复杂性。但是,递归地访问所有
SqlCall
节点及其操作数,然后收集您看到的任何SqlIdentifier
值可能就足够了。sf6xfgos2#
它可以简单到: