我想在Java中获取数据库查询的main where子句的索引? 我怎么能用Regex来处理这个?
例如,在此查询中,我想获得Second where子句:
select u.id, (select x.id from XEntity where x.id = 200)
from UserEntity u
**where** u.id in (select g.id from AnotherEntity g where g.id = 100)
我认为主要的位置是“(”字符和“)”字符在它之后是相等的。 但我不知道怎样才能用正则表达式来实现这个目标。
最诚挚的问候
答案 0 :(得分:0)
正则表达式不是很擅长识别SQL查询这样复杂的结构。主要是因为SQL不是无上下文的,这正是你遇到的问题:WHERE可以出现在很多地方,你需要一个特别依赖于查询的整体结构。
您需要的是适当的解析器。 only JavaScript SQL parser I could find不是太完整,但您可以通过确保它符合您的需求来帮助开发它。
答案 1 :(得分:0)
Toote和David Brabant所说的绝对是正确的。解析SQL,尤其是仅使用正则表达式的复杂SQL是一个非常难的问题。
在解析Java中的SQL方面,这似乎是你问题的主旨,有一个非常好的(如果显然是未维护的)库called JSQLParser。可以在Github here上找到该库的更新版本(免责声明:我对此做了很少的贡献)。主页面显示了一个访问者的示例,旨在使用AST here的输出。
ANTLR available in it's grammar list还有一个语法。或者,如果您喜欢冒险,H2数据库支持相当广泛的SQL,包括MySQL的一些专有功能。您可以修改它Parser以生成用于提取所需信息的适当结构。