2

我需要一种在 SQL 查询中搜索单词的方法,并且能够确定该单词是在子查询中还是在主查询中。

例如:

SELECT * 
FROM products 
WHERE id NOT IN (SELECT product_id 
                 FROM tagmap 
                 WHERE tag_id = 1)

我需要用查询字符串中的单词实例替换这个词的实例WHEREWHERE 1=1 AND但只能在主查询中,而不是在子查询中。

这只是我面临的问题的一个例子。真正的查询比这大得多,并且包含几个子查询!此外,我需要为数百个查询执行此操作,因此我需要能够自动执行此操作。

4

1 回答 1

2

认为以下正则表达式:

(?<!\(.*)\b(WHERE)\b|\b(WHERE)\b(?!.*\))

将匹配“WHERE”的任何实例:

  • 出现在第一个括号的左侧,或
  • 出现最后一个括号的右侧。

即不会检测出现(..).

它适用于我尝试过的几个测试用例......如果没有进一步澄清您的要求,我不会再做任何测试......

EG 下面,我用波浪号包围表示匹配的实例:~WHERE~

SELECT * 
FROM products 
~WHERE~ id NOT IN 
    (SELECT product_id FROM tagmap WHERE tag_id = 1 and (SELECT true WHERE something) );

SELECT x FROM y ~WHERE~ z = z;

SELECT Count(*) 
FROM (Select rows FROM table WHERE filter) 
~WHERE~ z

强烈建议您在依赖它之前彻底测试它。


编辑:一个基本的.NET实现......因为我现在已经打开了VS......;-)

using System;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        StreamReader sr = new StreamReader("pathToSqlScript.sql");
        string oldSQLString = sr.ReadToEnd();
        string newSQLString = Regex.Replace(oldSQLString, @"(?<!\(.*)\b(WHERE)\b|\b(WHERE)\b(?!.*\))", @"WHERE 1=1 AND");
        StreamWriter sw = new StreamWriter("newSqlScript.sql");
        sw.Write(newSQLString);
    }
}

编辑:要在文本编辑器中执行此操作...

Visual Studio 将允许您执行基于正则表达式的搜索/替换。我想像 Notepad++ 这样的东西会做到这一点(至少在插件的帮助下)。或者这可能会帮助你:http ://www.regular-expressions.info/editpadpro.html

否则,敲出一些会读取/修改您的文本文件的东西,例如使用 PHP、.NET、Java ......

于 2012-10-09T15:56:38.983 回答