在 Java 中评估 SQL 表达式?

Alp*_*pay 5 java sql

在我们的项目中,我们需要在没有任何数据库服务器的情况下评估 SQL 语句。您能否推荐任何能够评估基于数学的 SQL 语句并返回结果的免费 Java 库?

例如;

输入

SELECT 2*2 AS RESULT

输出

4

可能会被称为int result = SQLEvaluator.evaluate("SELECT 2*2 AS RESULT");

acd*_*ior 2

可以使用ZQL来实现这一点,如下面的代码所示。但我认真建议您选择一个简单的嵌入式数据库,例如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();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

4
5
9
Run Code Online (Sandbox Code Playgroud)

要使用它,请将其添加到您的pom.xml

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.3.171</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

使用 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

4.0
5.0
9.0
Run Code Online (Sandbox Code Playgroud)

对于依赖项,可以从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>
Run Code Online (Sandbox Code Playgroud)