【发布时间】: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,你想返回什么?我想你也可以允许列名中包含多个单词,如果它被反引号包围(“SELECTuser idFROM ..”) -
我会研究一下sql parser,可惜我的sql不是纯洁的sql,就是ibatis风格的参数化sql,不知道这样行不行值得研究。我重新编辑了线程并粘贴了完整的 sql。谢谢