2017-06-12 1 views
0

J'ai un cas d'utilisation où je veux connaître les colonnes qui ont été sélectionnées dans une instance SQL string.For, si le SQL est comme ceci:
SELECT name, age*5 as intelligence FROM bla WHERE bla=bla
Ensuite, , après l'analyse de la chaîne ci-dessus, je veux juste que la sortie soit: name, intelligence.
Premièrement, est-ce possible grâce à Calcite?
Toute autre option est également la bienvenue. PS: Je veux savoir ceci avant d'exécuter la requête sur la base de données.Apache Calcite pour trouver les colonnes sélectionnées dans une SQL chaîne

Répondre

2

Ceci est certainement possible avec Calcite. Vous voulez commencer par la création d'une instance de SqlParser et analyse de la requête:

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

À partir de là, vous aurez probablement le plus de succès la mise en œuvre de l'interface SqlVisitor. Vous devez d'abord rechercher une instance SqlSelect, puis visiter chaque expression sélectionnée en appelant la visite sur chaque élément de getSelectList. À partir de là, la façon dont vous allez procéder dépendra de la complexité des expressions que vous voulez prendre en charge. Cependant, il est probablement suffisant de visiter récursivement tous les nœuds SqlCall et leurs opérandes, puis de collecter les valeurs SqlIdentifier que vous voyez.

+0

Pouvez-vous juste analyser une partie de l'expression sql? par exemple. l'analyse de SUM (montant)/Count (id). Je peux faire du sqy fictif mais ce serait bien de pouvoir analyser une expression sql valide faite de fonctions sql. – nir

+1

Vous devriez pouvoir utiliser la méthode 'parseExpression' de' SqlParser' pour les cas comme celui-ci. –