【问题标题】:How to parse out all columns out of a sql using regular expression?如何使用正则表达式从 sql 中解析出所有列?
【发布时间】:2012-02-27 06:55:16
【问题描述】:

我想使用正则表达式从 sql 中解析出所有列,但不知道解析带有函数的 sql.Like :

 SELECT
   NVL(SUM(MISSIONNO), 0) DISTCNT, COUNT(DISTINCT(USERID)) USERIDCNT
  FROM EVTSUPPLYHIST
 WHERE EVTCODE = #evtCode#
   AND EVTNO = #evtNo#
   AND GIFTCODE = #giftCode#
   AND SUPPLYDT BETWEEN TO_DATE(#startDate#, 'YYYY/MM/DD HH24:MI:SS') 
   AND TO_DATE(#endDate#, 'YYYY/MM/DD HH24:MI:SS')

对于上面的这个sql,正确的结果应该是DISTCNT和USERIDCNT,你可能猜到它不是纯洁的sql,而是基于ibatis的参数化sql。有什么想法吗?

【问题讨论】:

  • 我觉得没有灵丹妙药,SQL是一种语言,解析语言需要编写解析器。我敢肯定,如果您四处搜索,您会发现一个用 Java 编写的 SQL 解析器。请注意,由于 SQL 不是 regular language,您将能够使用正则表达式可靠地解析它。
  • 使用 sql 解析器代替正则表达式
  • 没那么容易。而且你不能只用正则表达式来做到这一点,因为有很多嵌套的括号。
  • 也许作为粗略的第一个近似值,您可以查找包含[a-zA-Z_] 的逗号之前或“FROM”(从查询中删除新行之后)之前的单词?如果查询是SELECT COUNT(USERID) FROM USER_INFO,你想返回什么?我想你也可以允许列名中包含多个单词,如果它被反引号包围(“SELECT user id FROM ..”)
  • 我会研究一下sql parser,可惜我的sql不是纯洁的sql,就是ibatis风格的参数化sql,不知道这样行不行值得研究。我重新编辑了线程并粘贴了完整的 sql。谢谢

标签: java sql regex


【解决方案1】:

我建议使用众多 SQL 表达式解析器之一,例如 zql。从他们的文档中我看到,他们从 SQL 表达式创建了一个 java 对象,从该数据结构中获取列名应该很简单。

【讨论】:

  • 我试过zql,但是好像没有很好的文档,所以我放弃了。
  • 他们提供了一些很好的例子,我花了几分钟来解析一个 sql 查询字符串,但是 - 它不会读取你的 special sql 方言。 (无法识别的函数NVL)必须调整 JavaCC 输入文件
【解决方案2】:

如果您在执行查询后可以等待,您可以很容易地从返回的 ResultSet 中获取所有信息。

ResultSetMetaData meta = rs.getMetaData();
int colCount = meta.getColumnCount();

for (int i = 0; i < colCount; i++) {
  String colName = meta.getColumnName(i + 1);
}

【讨论】:

  • 如果是通过jdbc执行的,完全正确。但我的情况是我需要在不执行 jdbc 的情况下获取信息。我正在开发一个可以根据sql生成vo的代码生成工具。
猜你喜欢
  • 2020-06-22
  • 2013-05-11
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多