当解析查询时,我使用关键字“ 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。第一次出现是列的别名,第二次出现是表的别名。
答案 0 :(得分:1)
不要对需要上下文的令牌使用visitTerminal
访问者方法。而是使用方法访问包含规则。这取决于您的语法(此处未引用),因此我只能猜测。但是您可能会遇到类似SELECT selectItem* fromClause whereClause? ...
的情况。 selectItem
规则可能包含以下内容:
selectItem: expr alias?;
与
alias: AS_SYMBOL? identifier;
现在,您可以使用visitSelectItem
访问者方法,通过检查传入的上下文(大致为context.alias().AS_SYMBOL
)来确定是否存在列/子查询别名。
这只是可以在其中使用AS关键字的一个示例,但是对于所有其他出现情况,其原理都是相同的。访问包含规则(可能不是直接包含规则(例如alias
),而是更高级别的规则,它为您提供了足够的上下文来确定您要查看的AS。