2011-01-17 21 views
2

最初に、私は正規表現で実際に実験されていないと告白します。私はそれをどのように使用するのか知っていますが、私が1つを構築したいときは、それは他のものです...私は私を文書化します。SQLを抽出する正規表現。

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)) 

私は 'どこで'と( '注文'または '制限'または 'グループ化')の間にすべてを取得したい...

誰かが私のためのアドバイスをしていますか?私はいくつかの検索を行っており、このようなものは見つけられません。 SQL Parserが見つかりましたが、これらのエンジンは完了したいタスクに比べて大きすぎます。

ありがとうございます。

+1

これは一般的な方法がわかりませんが、複数のwhere句に注意する必要がありますか。サブクエリで? – Paddy

+0

私は同様の問題を抱えています。最も近いのは次の式です。 (?:^ | \))(?:[^ \(\)] +) :group by | order by | $) –

答えて

2

WHERE句は(FOR XMLで使用する場合、たとえば、いくつかのケースでORDER BYを含むことがサブクエリを含む)は非常に複雑になることがありますので、あなたが本当に正規表現で常に確実に働いて解決策を見つけることができませんので。

適切な解決策は、ASTを生成する適切なSQLパーサを使用することです。次に、それからWHERE句を抽出するだけです。 T-SQLの場合、bsn ModuleStoreプロジェクト(LGPLライセンス)のパーサを使用できます。 ASTの変更は簡単で、後でそのステートメントを再スクリプトすることができます。

+0

Luceroに感謝します。私はJSQLParserを使用するつもりです。http://jsqlparser.sourceforge.net/ – LarZuK

+0

フィードバックに感謝します。 – Lucero

1

lookbehead(?< =)を使用していますが、先読み(?=)アサーションが必要です。

そこにmoreがあります。

0

これは、あなたが軌道に乗るかもしれない:意志出力WHERE columnA = 'B' AND columnB = 'C'上記

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; 
/

スクリプトレットを。