JSQLParser 可以区分 SELECT 查询中的 View/Function/Table 吗?
例如,如果以以下方式执行函数: select * from public.new(10); 选择 public.new(10);
JSQL 是否有可能找出它正在执行一个函数并返回该信息?
JSQLParser 可以区分 SELECT 查询中的 View/Function/Table 吗?
例如,如果以以下方式执行函数: select * from public.new(10); 选择 public.new(10);
JSQL 是否有可能找出它正在执行一个函数并返回该信息?
答案是:视情况而定。
JSqlParser 只是一个解析器,没有关于数据库模式的信息。在某些数据库中,允许在没有括号的情况下调用无参数函数,例如select NOW
(希望这确实是一个函数;))。在这种情况下, NOW将被接受为列名。
但是 JSqlParser 支持参数化函数,例如select testfunc(param1)
. 在这种情况下,它将被接受为一个函数。
从语法上讲,视图和表的用法是相同的,而JSqlParser不能在它们之间有所不同。视图名称将被接受为表名称。
要区分:
所以这里是第 1 点和第 2 点的一个小例子:
Statement statement = CCJSqlParserUtil.parse("select myfunc(5), now from public.new(10), mytable");
TablesNamesFinder tablesNamesFinder = new TablesNamesFinder() {
@Override
public void visit(Column tableColumn) {
System.out.println("column = " + tableColumn);
}
@Override
public void visit(Function function) {
System.out.println("function = " + function.getName());
super.visit(function);
}
@Override
public void visit(Table tableName) {
System.out.println("table = " + tableName.getFullyQualifiedName());
super.visit(tableName);
}
@Override
public void visit(TableFunction valuesList) {
System.out.println("table function = " + valuesList.getFunction().getName());
super.visit(valuesList);
}
};
System.out.println("all extracted tables=" + tablesNamesFinder.getTableList(statement));
结果是:
function = myfunc
column = now
table function = public.new
table = mytable
all extracted tables=[mytable]