2

SQLクエリ内の単語を検索し、その単語がサブクエリ内にあるかメインクエリ内にあるかを判断できる方法が必要です。

例えば:

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

WHERE単語のインスタンスを、たとえばクエリ文字列で置き換える必要がありますがWHERE 1=1 AND、サブクエリではなくメインクエリでのみ置き換えます。

これは私が直面している問題の一例にすぎません。実際のクエリはこれよりはるかに大きく、いくつかのサブクエリが含まれています。また、これを行うために必要なクエリは何百もあるので、これを自動的に実行できるようにする必要があります。

4

1 に答える 1

2

次の正規表現だと思います

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

「WHERE」のすべてのインスタンスに一致します。

  • 最初の開き括弧の左側にある、または
  • これは、最後の閉じ括弧の右側にあります。

つまり、で発生するWHEREのインスタンスは検出されません(..)

それは私が試したいくつかのテストケースで機能しました...そして私はあなたの要件をさらに明確にすることなしにこれ以上のテストをするつもりはありません...

以下の例では、チルダで囲むことにより、一致するインスタンスを示しています~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 に答える