JSQL Parser - 关于解析函数的信息
JSQL Parser - Info on parsing functions
JSQLParser 可以区分 SELECT 查询中的 View/Function/Table 吗?
例如,如果通过以下方式执行函数:
select * 来自 public.new(10);
select public.new(10);
JSQL 是否有可能弄清楚它正在执行一个函数并return那个信息?
答案是:视情况而定。
JSqlParser 只是一个解析器,没有关于数据库架构的信息。在一些数据库中,无参数函数被允许在没有括号的情况下被调用,例如select NOW
(希望这确实是一个函数;))。在这种情况下,NOW 将被接受为列名。
但是JSqlParser支持参数化函数,例如select testfunc(param1)
。在这种情况下,它将被接受为 function.
在语法上 view 和 table 的用法是相同的,并且 JSqlParser不能区分那些。视图名称将被接受为 table 名称。
获得差异化:
- 首先你会让 JSqlParser 解析你的语句
- 提取所有列名、table 名称、函数名(这里的一个好的开始是 TableNameFinder 实用程序 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]
JSQLParser 可以区分 SELECT 查询中的 View/Function/Table 吗?
例如,如果通过以下方式执行函数: select * 来自 public.new(10); select public.new(10);
JSQL 是否有可能弄清楚它正在执行一个函数并return那个信息?
答案是:视情况而定。
JSqlParser 只是一个解析器,没有关于数据库架构的信息。在一些数据库中,无参数函数被允许在没有括号的情况下被调用,例如select NOW
(希望这确实是一个函数;))。在这种情况下,NOW 将被接受为列名。
但是JSqlParser支持参数化函数,例如select testfunc(param1)
。在这种情况下,它将被接受为 function.
在语法上 view 和 table 的用法是相同的,并且 JSqlParser不能区分那些。视图名称将被接受为 table 名称。
获得差异化:
- 首先你会让 JSqlParser 解析你的语句
- 提取所有列名、table 名称、函数名(这里的一个好的开始是 TableNameFinder 实用程序 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]