一个正则表达式来提取SQL where子句

首先,我承认我不是真的正则表达式的尝试。 我知道如何使用它,但是当我想建立一个,它是别的东西......我要记录我的。

我想提取的SQL查询的WHERE子句。 我的目标是能够增加一个条件,就像这样:

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

至 :

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

我尝试了一些表达,但我很空虚...

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

我想获得的所有的',其中'和(“按订单”或“限制”或“GROUP BY”)...

任何人对我有一个建议吗? 我已经做了一些搜索,我不觉得这样的事。 我发现了SQL分析器,但比起我要完成的任务,这些发动机是太大了。

谢谢。

--------------解决方案-------------

因为WHERE子句可以是相当复杂(包括子查询可能包括一个ORDER BY当用于在某些情况下,例如FOR XML ),所以你将不能够真正找到一个正则表达式的总工作可靠的解决方案。

更好的解决方案是使用它生成一个AST正确的SQL语法分析程序,然后你可以只提取WHERE从该条款。 对于T-SQL,你可以使用解析器从BSN ModuleStore项目(LGPL许可证)。 修改AST是很简单的,你可以重新脚本语句之后。

您正在使用后向(?<=),而你需要向前看(?=)断言。

还有更多这一点。

这可能让你去:

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'

分类:SQL 时间:2012-01-01 人气:31
分享到:

相关文章

  • SQL服务器的条件where子句 2014-11-24

    我建议低于原条件合适了Syntex. ALTER PROCEDURE [dbo].[pro_name] @number as int , Select * from table if(@number=0) begin set @number=select max(number)from table end where table.number=@number 在这里,我需要设置@number与最大值,如果传递的输入值是'0'. 同时也希望日E在wherer子句中使用相同. -----------

  • SQL游标与条件WHERE子句 2013-01-28

    我有一个光标在那里我传递一个标志,并且光标在里面,我使用以下条件 cursor abc (c_flag ) IS select 1 from pqr p where p.c1 = CASE c_flag ='Y' THEN p.c1 ELSE IS NOT NULL END 现在的问题是,ELSE情况下也不会为我工作,因为它应该这样写p.c1 IS NOT NULL ,而不是p.c1 = IS NOT NULL. 我觉得你得到了我想要做的,如果c_flag是肯定的,我会采取所有的记录,如果没有的

  • SQL Server的条件where子句的大麻烦 2012-03-17

    2Im在一个大麻烦,即时通讯重构一个非常大的程序,全文搜索,我发现一个很重要的外部应用: select top 1 * from tablea where column1 like case when @value = 1 or @value = 2 then '%' + @something + '%' else '%' end 这里的逻辑是:如果@value是1或2,得到第一寄存器里面@something. 否则,得到任何寄存器. 我现在需要的是: select top 1 * from t

  • 它是更好地使用具备一个条件,或使用具有100条件WHERE子句一个查询WHERE子句100 SQL查询? 2013-10-19

    它是更好地使用具备一个条件,或使用具有100条件WHERE子句一个查询WHERE子句100 SQL查询? 例如,如果我一直在寻找,看看100的用户名是否已经存在于表中,那会是更好的通过100查询到迭代或做一件复杂的查询,查找在同一时间100的用户名. --------------解决方案------------- 我没有做过任何测试,但我宁愿一个大的查询. 与100个查询,您必须连接到数据库,发送查询字符串,并处理响应/结果100倍. 一个单一的查询,你发送一个(大)查询,并获得一个响应回来.

  • SQL - 创建条件WHERE子句这个简单的查询 2012-09-13

    我一直在试图创建一个条件where子句我下面的查询,但我一直看到那么多的选择,我不知道在这种情况下使用什么. 我需要的是沿着这个东西线:(当然这个代码是错误的) where casCaseType='m' and casCurrentWorkflowID=990 and cmsDateCreated between @FromDate and @ToDate CASE @WFStatus WHEN @WFStatus=1 then eveworkflowID<100 WHEN @WFStatus

  • 正则表达式/解析XML文件 2012-02-20

    我有一帮由自定义标签中的数据的XML文件. 这是针对一个项目,我都非常有用,但对于其他项目,我不需要这么多的信息. 所以我想修剪XML文件,摆脱任何标记之间某些标记的所有实例和. <GOBJ> <cost>4</cost> <duration>n/a</duration> <item>Stone Block</item> <type>Construction - Material</type> &l

  • 以实体条件Where子句中的LINQ返回所有列 2012-05-05

    我使用的条件where子句在LINQ to实体如下 Dim q = (From x In ctx.Product) If mySearchField = SearchField.ProductId Then q = q.Where(Function(y) y.ProductId = mySearchTerm) ElseIf s.SearchField = SearchField.ProductCode Then q = q.Where(Function(y) y.ProductCode = my

  • 解析条件表达式为String 2012-07-15

    我在寻找解析条件表达式为字符串的方法. 我能想到的最好的例子就是LINQ到SQL. 它使用ExpressionVisitors格式化"去哪儿"的条款. 例: from a in b where ax == 5 && ay < 3 select a 这将转化为以下字符串(约,MSSQL是不是目前对我来说): "SELECT * FROM b WHERE x = 5 AND y < 3" 从我读过,这样做是使用ExpressionVisito

  • LINQ到实体 - 左外连接与条件where子句 2012-11-20

    我有这样的项目设置与EF4和我使用LINQ到实体,形成查询. 我遇到一些麻烦,涉及到很多的条件where子句和几个左外连接的查询. 我已经解决了部分有条件的地方用下面的方法扩展条款(我发现这里). public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Expression<Func<TSource, bool>

  • SQL Server的条件选择到临时表 2012-12-24

    我工作在SQL Server 2008中,和我想要选择到基于特定条件的临时表......一个报告,我需要最多的记录,18%是一个特定的产品类型. if ((@totalRecords * .18) > @productTypeCount) select * into #tmpLP_REIT from myTable where productType = @productType else select top 18 percent * into #tmpLP_REIT from myTable

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.518 (s). 11 q(s)