gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:21:41 25 4
gpt4 key购买 nike

例如

query = " select "2017-06-08" as new_colum, "true" as my_flag, "column1", "column2" from "table1" "

上面的查询应该改成:

从 [table1] 中选择“2017-06-08”作为 new_column,“true”作为 my_flag,[column1],[column2]。 (MS SQL 格式)

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

最佳答案

如果不是因为您的日期被双引号括起来,我们本可以将 "(.*?)" 替换为 [$1] 使用 String#replaceAll()。但是双引号日期的存在使问题变得更加困难。我更新后的答案使用以下模式来仅针对双引号中的非日期:

(\s+)"([^\d].*?)"

这只会匹配前面至少有一个空白字符的引号术语,并且引号内的第一个字符不是数字。这应排除所有日期,并且不应排除任何列,因为 SQL Server 列名不能以数字开头。

我在这里假设每个引用的列前面都有空格。这应该没问题,假设查询字符串中的第一个词始终是关键字,如 SELECTUPDATE

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() 会错误地将 结束 引号视为术语的开始,但事实并非如此。

Demo

关于java - 替换 SQL 查询中表名、列名周围的转义字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44455640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com