私たちのプロジェクトでは、データベース サーバーなしで SQL ステートメントを評価する必要があります。数学ベースの SQL ステートメントを評価して結果を返す機能を備えた無料の Java ライブラリを提案できますか?
例えば;
入力
SELECT 2*2 AS RESULT
出力
4
おそらく次のように呼ばれますint result = SQLEvaluator.evaluate("SELECT 2*2 AS RESULT");
以下のコードに示すように、ZQLを使用してそれを実現することができます。しかし、 H2などの単純な組み込みデータベース( example here ) を選択し、代わりに使用することを強くお勧めします(プロジェクトの健全性ははるかに高くなります)。
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>
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>