提取SQL where子句的正则表达式

时间:2011-01-17 11:07:26

标签: sql regex parsing where-clause conditional-statements

首先,我承认我并没有真正尝试过正则表达式。我知道如何使用它,但是当我想要构建一个时,它就是其他东西......我要记录下来。

我想在SQL查询中提取WHERE子句。我的目标是能够添加一个条件,如下所示:

SELECT * FROM myTbl WHERE columnA = 'B' AND columnB = 'C' ORDER BY columnX GROUP BY columnZ LIMIT 5

TO:

SELECT * FROM myTbl WHERE columnC = 'D' AND (columnA = 'B' AND columnB = 'C') ORDER BY columnX GROUP BY columnZ LIMIT 5

我尝试了一些表达,但我很无效......

(where (.*)(?<=order by))

我希望在'where'和('order by'或'limit'或'group by')之间得到所有... ...

有人对我有建议吗?我做了一些搜索,我没有找到这样的东西。我找到了SQL Parser,但与我想要完成的任务相比,这些引擎太大了。

谢谢。

3 个答案:

答案 0 :(得分:2)

由于WHERE子句可能非常复杂(包括在某些情况下可能包含ORDER BY的子查询,例如与FOR XML一起使用时),因此您将无法真正找到一个始终可靠的解决方案与正则表达式。

更好的解决方案是使用生成AST的正确SQL解析器,然后您可以从中提取WHERE子句。对于T-SQL,您可以使用bsn ModuleStore项目(LGPL许可证)中的解析器。修改AST很简单,之后您可以重新编写语句脚本。

答案 1 :(得分:1)

你正在使用lookbehind(?&lt; =),而你需要先行(?=)断言。

那里有more

答案 2 :(得分:0)

这可能会让你:

declare
  sql_stmt varchar2(4000) := q'!SELECT * FROM myTbl WHERE columnA = 'B' AND columnB = 'C' ORDER BY columnX GROUP BY columnZ LIMIT 5!';

  where_stmt varchar2(4000) ;

begin
  where_stmt := regexp_replace(sql_stmt, '.*(WHERE.*?)ORDER BY.*', '\1');

  dbms_output.put_line(where_stmt);

end;
/

上面的 scriplet 将输出WHERE columnA = 'B' AND columnB = 'C'