解析查询时如何区分使用AS关键字

时间:2019-05-15 16:45:27

标签: mysql sql parsing antlr4

当解析查询时,我使用关键字“ AS”时,如何确定它是表的别名还是列的别名?

    @Override public void visitTerminal(TerminalNode node) {
        switch (node.getText().toUpperCase()) {
        case "AS":
            processTerminalNodeAs(node);
            break;
        }
   }

例如:

SELECT LoyaltyNumber AS LN FROM Transaction AS T;

解析器将两次找到关键字AS。第一次出现是列的别名,第二次出现是表的别名。

1 个答案:

答案 0 :(得分:1)

不要对需要上下文的令牌使用visitTerminal访问者方法。而是使用方法访问包含规则。这取决于您的语法(此处未引用),因此我只能猜测。但是您可能会遇到类似SELECT selectItem* fromClause whereClause? ...的情况。 selectItem规则可能包含以下内容:

selectItem: expr alias?;

alias: AS_SYMBOL? identifier;

现在,您可以使用visitSelectItem访问者方法,通过检查传入的上下文(大致为context.alias().AS_SYMBOL)来确定是否存在列/子查询别名。

这只是可以在其中使用AS关键字的一个示例,但是对于所有其他出现情况,其原理都是相同的。访问包含规则(可能不是直接包含规则(例如alias),而是更高级别的规则,它为您提供了足够的上下文来确定您要查看的AS。