JavaでSQLを解析するのに助けが必要

java regex
JavaでSQLを解析するのに助けが必要

sqlステートメントを分割し、列のインデックスを指定する以下のコードがあります。

String sql = "INSERT INTO Table1(SSN, EMPID) VALUES (?,?)";

    public static List indices(String stmt) {
        List list = new ArrayList();
        String variables[] = null;
        try {
            variables = stmt.substring(stmt.indexOf('(')+1,
                stmt.indexOf(')', stmt.indexOf('(')+1)).split("\\,");
        } catch (Exception e) {}

        for (int i=0; i < variables.length; ++i ) {
            Object [] str =  new Object [2] ;
            str[0] = variables[i].trim() ;
            str[1] = ((Integer)(i+1)) ;
            list.add(str) ;
        }
        return list;
    }
+
Result -

list[0] >>

array[0] = SSN
array[1] = 1

list [1] >>
array[0] = EMPID
array[1] = 2

代わりに次のSQLを分割する適切な正規表現で私を指すことができますか?

sql = "if not exists (select * from Table1 where SSN = ? and EMPID =?)
      INSERT INTO Table1(SSN, EMPID) VALUES (?,?)"

出力は次のようになると思います-

list[0] >>
array[0] = SSN
array[1] = 1

list [1] >>
array[0] = EMPID
array[1] = 2

list[2] >>
array[0] = SSN
array[1] = 1

list [3] >>
array[0] = EMPID
array[1] = 2

ありがとうございました

  2  1


ベストアンサー

正規表現またはその他の低レベル文字列バッシングを使用して、SQLなどの重要な言語を解析しようとするのは悪い考えです。 判読不能なコードと、無効または有効であるが異なる入力が提供されると壊れる壊れやすい「パーサー」になります。

適切なSQLパーサーを実装する(または既存のパーサーを使用する)か、SQLを解析せずに他のものからアセンブルするようにコードを変更する必要があります。

_
フレームワークに依存するアプリケーションがあり、新しいライブラリを導入したくありません!
_

それが適切な解析を行わない悪い理由です。 別のライブラリを使用しないことで何が問題になりますか?

4


代替としてのこれについてはどうですか:http://www.gibello.com/code/zql/[Zql、a SQL parser]。 SQLステートメントの「要素」へのアクセスがはるかに簡単になります。

編集

2番目のSQLの最も簡単なアプローチ:

sql.split(" INSERT INTO ")`を実行し、既存のコードを2番目の配列エントリに適用します( `" Table1(SSN、EMPID)VALUES(?、?) ")。 あなたのコードを理解している限り、それは正しい結果を与えるはずです。

はい、あなたの主張を逃しました。 パーサーを使用してください。

1


  • http://zql.sourceforge.net/ [ZQLパーサー] *はすばらしい。

「CREATE」を除くほとんどすべてのクエリを解析できます*

特徴:

  • 「列のリスト」、

  • 「リスト表」、

  • 「FOR句」、

  • 「WHERE句」

  • etc

0


タイトルとURLをコピーしました