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());
}
Другие вопросы по тегам