Apache Calcite для поиска выбранных столбцов в строке SQL
У меня есть случай использования, когда я хочу знать столбцы, которые были выбраны в строке SQL. Например, если SQL похож на это:SELECT name, age*5 as intelligence FROM bla WHERE bla=bla
Затем, после анализа вышеупомянутой строки, я просто хочу, чтобы вывод был: name, intelligence
,
Во-первых, возможно ли это через кальцит?
Любой другой вариант также приветствуется.
PS: я хочу знать это до того, как запустим запрос к базе данных.
1 ответ
Это определенно выполнимо с кальцитом. Вы хотите начать с создания экземпляра SqlParser
и разбор запроса:
SqlParser parser = SqlParser.create(query)
SqlNode parsed = parser.parseQuery()
Оттуда вы, вероятно, добьетесь наибольшего успеха в реализации SqlVisitor
интерфейс. Вы хотите сначала найти SqlSelect
экземпляр, а затем посетить каждое выбранное выражение, вызвав визит на каждый элемент getSelectList
,
Оттуда, как вы будете действовать, будет зависеть от сложности выражений, которые вы хотите поддерживать. Однако, вероятно, достаточно рекурсивно посетить все SqlCall
узлы и их операнды, а затем собирать любые SqlIdentifier
ценности, которые вы видите.
Это может быть так просто, как:
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());
}