【问题标题】:String parsing for nested SQL query in JavaJava中嵌套SQL查询的字符串解析
【发布时间】:2015-12-01 16:53:52
【问题描述】:

我正在对 SQL 查询进行一些字符串解析,并且在识别和提取嵌套查询方面遇到了一些十字路口。在这种情况下:

select name, wins
from mlb_team
where wins > (select avg(wins) from mlb_team) and league = 'NL'
order by wins desc

我想提取(select avg(wins) from mlb_team)。在嵌套查询的情况下会出现一个更全局的问题,该查询包含嵌套查询的父查询中的关键字之后的关键字。即

select columns
from table
where column_val > (select avg(column) from table where conditional order by column asc) and league = 'NL'
order by wins desc

嵌套查询与父查询一样包含 order by 子句,因此单独搜索该关键字无法使此代码更通用。我希望能够放入任何查询并让它提取嵌套查询。

提示或建议会有所帮助。我目前正在使用大量正则表达式来提取子句,并且单表查询处理正常(即我自己获取每个单独的子句)但是对于嵌套查询我遇到了困难。

谢谢大家!

【问题讨论】:

标签: java sql regex string-parsing


【解决方案1】:

在你的情况下,你可以使用这个 RegEx:

\(select.+(desc|asc|\)|$)

使用递归函数,您可以解析更多子查询。

但我强烈建议不要使用正则表达式解析 SQL,并且正如@RC 建议的那样,使用已经构建的 SQL 解析器。您打开了一个永无止境的故事,您将始终在解析器上进行开发。 (取决于 DBMS 或 ANSI SQL or or or,只是不要这样做)

【讨论】:

  • 我会使用 SQL 解析器,但这是一个教授的工具,我正在构建作为研究项目的一部分。我们选择从头开始对其进行编码,因此它可以由学生在路上维护,因为我们正在构建的工具是用于课堂教学的。我们不想依赖外部代码来维护良好并与我们始终需要的内容保持同步,因此我们选择从头开始编写所有内容。也感谢您的正则表达式。需要注意的是在查询中,字符串文字中可能有括号,我不希望它抓住这些作为结束括号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
相关资源
最近更新 更多