例如
query = " select "2017-06-08" as new_colum, "true" as my_flag, "column1", "column2" from "table1" "
上述查询应更改为:
select "2017-06-08" as new_column, "true" as my_flag, [column1], [column2] from [table1]
。 (MS SQL格式)
我可以使用像jsql解析器这样的解析器吗?或者还有其他更好的方法吗?
答案 0 :(得分:7)
如果不是因为您的日期被双引号括起来,我们可以使用"(.*?)"
用[$1]
替换String#replaceAll()
。但双引号日期的存在使问题更加困难。我更新的答案使用以下模式仅以双引号定位非日期:
(\s+)"([^\d].*?)"
这只会匹配一个前面至少有一个空白字符的引用字词,并且引号内的第一个字符不是一个数字。这应排除所有日期,并且不应排除任何列,因为SQL Server列名称不能以数字开头。
我在此假设每个引用的列前面都有空格。这应该没问题,假设查询字符串中的第一个单词始终是SELECT
或UPDATE
之类的关键字。
String query = "select \"2017-06-08\" as new_colum, \"column1\", \"column2\" from \"table1\"";
query = query.replaceAll("(\\s+)\"([^\\d].*?)\"", "$1[$2]");
System.out.println(query);
<强>输出:强>
select "2017-06-08" as new_colum, [column1], [column2] from [table1]
顺便说一句,如果您想知道在引用术语开始之前检查空格的重要性,请尝试从正则表达式中取出该要求。您会看到replaceAll()
会错误地将结束引用作为术语的开头,而不是。{/ p>
答案 1 :(得分:0)
SQL Server Feature Pack附带了一个用于解析T-SQL源代码的专用API:[
TransactSql ScriptDom在Microsoft.SqlServer.TransactSql.ScriptDom
命名空间中可用。
在不同的类中,有一个TSqlParser
类,每个SQL Server版本都有子类。例如,对于SQL Server 2008,有以下类TSql100Parser
。
关于这个问题,here我找到了一个关于解析SELECT
语句的C#示例。