Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 替换SQL查询中表名、列名周围的转义字符_Java_Sql_Sql Server - Fatal编程技术网

Java 替换SQL查询中表名、列名周围的转义字符

Java 替换SQL查询中表名、列名周围的转义字符,java,sql,sql-server,Java,Sql,Sql Server,比如说 query = " select "2017-06-08" as new_colum, "true" as my_flag, "column1", "column2" from "table1" " 上述查询应更改为: 从[表1]中选择2017-06-08作为新的_栏,选择true作为我的_标志,[栏1],[栏2]。MS SQL格式 我可以使用像jsql解析器这样的解析器吗?或者还有其他更好的方法吗?如果不是因为您的日期被双引号括起来,我们本可以把。*全部替换掉?使用Stringrep

比如说

query = " select "2017-06-08" as new_colum, "true" as my_flag, "column1", "column2" from "table1" "
上述查询应更改为:

从[表1]中选择2017-06-08作为新的_栏,选择true作为我的_标志,[栏1],[栏2]。MS SQL格式


我可以使用像jsql解析器这样的解析器吗?或者还有其他更好的方法吗?

如果不是因为您的日期被双引号括起来,我们本可以把。*全部替换掉?使用StringreplaceAll时使用[$1]。但双引号日期的存在使问题更加困难。我的更新答案使用以下模式仅针对双引号中的非日期:

(\s+)"([^\d].*?)"
这将只匹配前面至少有一个空格字符且引号中的第一个字符不是数字的带引号的术语。这应该排除所有日期,并且不应该排除任何列,因为SQL Server列名不能以数字开头

我在这里假设每个被引用的列前面都有空格。假设查询字符串中的第一个单词始终是SELECT或UPDATE之类的关键字,则这应该是可以的

输出:

顺便说一下,如果您想知道在引用的术语开始之前检查空格的意义,请尝试从正则表达式中删除该要求。您将看到,replaceAll将在结束报价中错误地作为一个术语的开始,而事实并非如此

附带用于解析T-SQL源代码的专用API:[ Transact-SQL脚本DOM在命名空间中可用

在不同的类中,有一个TSqlParser类,每个SQL Server版本都有子类


关于这个问题,我找到了一个关于解析SELECT语句的C示例。

这是一个很好的解决方案,但在如下情况下可能会出现问题:String description=\description\;String query=SELECT\column1\from\table1\where description=+description;它将显示您从[table1]中选择[column1],其中description=[说明]而不是从[表1]中选择[列1]如果description=description,那么这个解决方案可能需要更多的工作吗?@YCF_L我使用OP中的示例回答。当然,如果引号在查询中有其他含义,例如作为字符串文字,我们就有问题。不过,理想情况下,字符串文字将使用单引号。然后您可能需要编写一些复杂的逻辑来解析queY.我认为没有银弹解决方案。@loknath我再次更新了我的答案。这一次,它并没有取代双引号中出现的日期。我现在将在我的答案中添加一些注释。正如我已经提到的,在一般情况下,您应该在这里使用解析器。我不会进行更新,因为毫无疑问呃,涵盖真实情况,你也会有其他的边缘情况。你的查询有多复杂?如果我们也能理解你为什么要更改,也许我们可以找到更好的方法,那么你为什么要在查询中更改?
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]