gpt4 book ai didi

java - 列出已解析的 SQL SELECT 语句的所有表/列

转载 作者:行者123 更新时间:2023-12-02 09:15:59 25 4
gpt4 key购买 nike

我正在尝试使用 JSqlParser 从 SQL SELECT 语句中提取表/列的列表。 SELECT 包含计算和嵌套 SELECT:

SELECT col1 AS a, (col2 - col21) AS b, col3 AS c FROM table1 
where col1 in (select col4 from table4)

这应该返回:

col1 table1
col2 table1
col21 table1
col3 table1
col4 table4

如果我用CCJSqlParserUtil解析它,我会得到不同的东西:

    Select stmt = (Select) CCJSqlParserUtil.parse("SELECT col1 AS a, col2 AS b, col3 AS c "
+ "FROM table1 WHERE where col1 in (select col4 from table4)");
Map<String, Expression> map = new HashMap<>();
for (SelectItem selectItem : ((PlainSelect)stmt.getSelectBody()).getSelectItems()) {
selectItem.accept(new SelectItemVisitorAdapter() {
@Override
public void visit(SelectExpressionItem item) {
map.put(item.getAlias().getName(), item.getExpression());
}
});
}

System.out.println("map " + map);

打印:

map {a=col1, b=col2, c=col3}

这不是我要找的。 SELECT 语句甚至可以更复杂,包含嵌套和子嵌套 SELECT;有没有办法获取所有列/表的列表?

最佳答案

要提取所有表名(模拟列名),您可以使用TableNamesFinder:

Statement statement = CCJSqlParserUtil.parse("SELECT * FROM MY_TABLE1");
Select selectStatement = (Select) statement;
TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
List<String> tableList = tablesNamesFinder.getTableList(selectStatement);

您使用的代码(我假设来自 JSQLParsers wiki)用于:

The task here is to build a map, where the alias is the key and the expression to this alias the value of one Map entry.

因此完全不同。

此外,您应该检查:Parsing table and column names from SQL/HQL Java

请记住,JSqlParser只是一个解析器。要将列映射到表,您必须检查数据库架构并在 sql 中引入某种 block 或可见性检查。以下是一些有问题的星座:

select a from tab1, tab2
select a, (select a from tab2) b from tab1
...

关于java - 列出已解析的 SQL SELECT 语句的所有表/列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58984896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com