我有这样的sql语句,我们需要修改它以供我们自己使用:
SELECT distinct [testCountry].[Division] as c0
FROM (....) AS testCountry
WHERE ([testCountry].[Division] <> '' and [testCountry].[Division] is not null)
ORDER BY [testCountry].[Division] asc
(....)部分包含其他sql语句,也可能包含关键字SELECT, WHERE, ORDER BY
。
在这里,我想删除最后的Where子句&#34; WHERE ([testCountry].[Division] <> '' and [testCountry].[Division] is not null)
&#34;
如何为此编写正则表达式?
我已经尝试过这样的事了:
string res = Regex.Replace(originalSql, @"(WHERE[\S\s]*?)(ORDER BY)", "$2");
但它会删除其他地方的所有WHERE
,后跟ORDER BY
。
另外如何更简洁地编写正则表达式?
谢谢!
答案 0 :(得分:2)
我知道这不是你要求的正则表达式解决方案,但它是一个解决方案。
var sql = "WHERE THIS = THIS WHERE this = that ";
var index = sql.LastIndexOf("WHERE");
var sqlnew = sql.Substring(0, index);
您可以使用上面的内容删除最后一个WHERE语句。然后,更容易在最后的句子上附加。
如果你也可以获得最后一个WHERE语句并正确地使用你需要的东西。
var whereStatement = sql.Substring(index, sql.length);
然后得到你想要的例子......
string res = Regex.Replace(whereStatement , @"(WHERE[\S\s]*?)(ORDER BY)", "$2");
答案 1 :(得分:2)
如果您匹配其他WHERE
,则无需担心更换它们。尝试
string res = Regex.Replace(originalSql, @"(.*)(WHERE[\S\s]*?)(ORDER BY)", "$1$3");
根据贪婪匹配的性质,这将确保只匹配最后一个WHERE
子句。
为了记录,我更喜欢Joshua's approach。如果可以的话,避免使用正则表达式,无论谁(包括你未来的自我)都会感激不尽。