Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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_Regex - Fatal编程技术网

Java 如何使用正则表达式解析sql中的所有列?

Java 如何使用正则表达式解析sql中的所有列?,java,sql,regex,Java,Sql,Regex,我想使用正则表达式解析sql中的所有列,但不知道解析函数附带的sql。例如: 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(#s

我想使用正则表达式解析sql中的所有列,但不知道解析函数附带的sql。例如:

 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表达式解析器中的一个,如。从他们的文档中我看到,他们从SQL表达式创建java对象,从该数据结构获取列名应该非常简单。

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

如果您可以在执行查询后等待,则可以非常轻松地从返回的结果集中获取所有信息

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

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

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

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

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

我不认为有什么灵丹妙药,SQL是一种语言,解析语言需要编写解析器。我相信如果你四处搜索,你会发现一个用Java编写的SQL解析器。请注意,由于SQL不是一个正则表达式,您将无法使用正则表达式可靠地解析它。请使用SQL解析器而不是regexp。这并不容易。因为有许多嵌套的括号,所以不能只使用正则表达式。也许作为粗略的第一近似值,您可以在从由[a-zA-Z_]组成的查询中删除新行后,查找逗号前面或“FROM”前面的单词?如果查询为SELECT COUNTUREID FROM USER_INFO,您希望返回什么?我想你也可以允许在一个列名中包含多个单词,如果它被后面的勾号包围,请选择用户id FROM.。我将对sql解析器进行一些研究,但不幸的是,我的sql不是纯sql,也就是说,它是ibatis风格的参数化sql,不确定这是否合适,值得研究。我已经重新编辑了线程并粘贴了完整的sql。谢谢,我不认为有什么灵丹妙药,SQL是一种语言,解析语言需要编写解析器。我相信如果你四处搜索,你会发现一个用Java编写的SQL解析器。请注意,由于SQL不是一个正则表达式,您将无法使用正则表达式可靠地解析它。请使用SQL解析器而不是regexp。这并不容易。因为有许多嵌套的括号,所以不能只使用正则表达式。也许作为粗略的第一近似值,您可以在从由[a-zA-Z_]组成的查询中删除新行后,查找逗号前面或“FROM”前面的单词?如果查询为SELECT COUNTUREID FROM USER_INFO,您希望返回什么?我想你也可以允许在一个列名中包含多个单词,如果它被后面的勾号包围,请选择用户id FROM.。我将对sql解析器进行一些研究,但不幸的是,我的sql不是纯sql,也就是说,它是ibatis风格的参数化sql,不确定这是否合适,值得研究。我已经重新编辑了线程并粘贴了完整的sql。谢谢如果它是通过jdbc执行的,那么它是完全正确的。但我的情况是,我需要在不执行jdbc的情况下获取信息。我正在开发一个代码生成工具,它可以根据sql生成vo。如果它是通过jdbc执行的,那么它是完全正确的。但我的情况是,我需要在不执行jdbc的情况下获取信息。我正在开发一个代码生成工具,它可以根据sql生成vo。我尝试了zql,但似乎它没有很好的文档记录,然后我放弃了。它们提供了一些很好的示例,我花了几分钟来解析sql查询字符串,但是-它不会读取您的特殊sql方言。无法识别的函数NVL One必须适应JavaCC输入文件我尝试了zql,但似乎没有很好的文档记录,于是我放弃了。它们提供了一些很好的示例,我花了几分钟来解析sql查询字符串,但是-它无法读取您的特殊sql方言。无法识别的函数NVL One必须调整JavaCC输入文件