4

私たちのプロジェクトでは、データベース サーバーなしで SQL ステートメントを評価する必要があります。数学ベースの SQL ステートメントを評価して結果を返す機能を備えた無料の Java ライブラリを提案できますか?

例えば;

入力

SELECT 2*2 AS RESULT

出力

4

おそらく次のように呼ばれますint result = SQLEvaluator.evaluate("SELECT 2*2 AS RESULT");

4

2 に答える 2

2

以下のコードに示すように、ZQLを使用してそれを実現することができます。しかし、 H2などの単純な組み込みデータベース( example here ) を選択し、代わりに使用することを強くお勧めします(プロジェクトの健全性ははるかに高くなります)。

H2 の使用:

public class H2ExpEval {
    public static void main(String... args) throws Exception {
        evaluateUsingH2("SELECT 2+2");
        evaluateUsingH2("SELECT 3+7-5");
        evaluateUsingH2("SELECT 2*2*2+1");
    }

    private static void evaluateUsingH2(String sql) throws Exception {
        Class.forName("org.h2.Driver");
        // opens an in-memory database: no files are saved and it's all quicker
        Connection conn = DriverManager.getConnection("jdbc:h2:mem:");
        Statement stat = conn.createStatement();
        ResultSet rs = stat.executeQuery(sql);
        if (rs.next()) {
            System.out.println(rs.getString(1));
        }
        stat.close(); conn.close();
    }
}

出力:

4
5
9

これを使用するには、これを に追加しますpom.xml

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.3.171</version>
</dependency>

ZQL の使用:

public class ZqlEvalDemo {
    public static void main(String args[]) throws Exception {
        System.out.println(evaluate("SELECT 2+2 FROM RESULT;"));
        System.out.println(evaluate("SELECT 3+7-5 FROM RESULT;"));
        System.out.println(evaluate("SELECT 2*2*2+1 FROM RESULT;"));
    }

    private static ZqlParser p = new ZqlParser();
    private static Object evaluate(String s) throws Exception {
        p.initParser(new java.io.ByteArrayInputStream(s.getBytes()));
        ZStatement st = p.readStatement();
        ZSelectItem zSelectItem = ((ZQuery) st).getSelect().get(0);
        ZExpression exp = (ZExpression) zSelectItem.getExpression();
        return new ZEval().evalExpValue(new ZTuple(), exp);
    }
}

出力:

4.0
5.0
9.0

依存関係については、ZQL ページからダウンロードするか、テスト目的でこれを追加しますpom.xml(誰がそのリポジトリを維持しているかがわからないため、テスト目的です)。

<dependencies>
  <dependency>
    <groupId>com.experlog</groupId>
    <artifactId>zql</artifactId>
    <version>1.0</version>
  </dependency>
</dependencies>
<repositories>
  <repository>
    <id>zql</id>
    <name>zql</name>
    <url>http://dbappserv.cis.upenn.edu:8080/artifactory/ext-releases-local</url>
  </repository>
</repositories>
于 2013-05-07T16:59:47.367 に答える