当前位置: 首页 > 面试题库 >

评估Java中的SQL表达式?

弓磊
2023-03-14
问题内容

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

例如;

输入

SELECT 2*2 AS RESULT

输出

4

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


问题答案:

如下面的代码所示,可以使用ZQL来实现。但是我严重建议您选择一个简单的嵌入式数据库,例如H2(此处为示例),而应使用它(项目运行状况要高得多)。

使用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>
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>


 类似资料:
  • 问题内容: 我正在寻找一种相对简单的方法(与编写解析器相比)来评估Java中的布尔表达式,并且我不想使用JEP库。 我有一个String表达式,例如:我的目标是用值替换变量。 有没有一种方法可以评估此​​表达式? 请记住,这可以是任何深度,因此编写解析器将非常复杂。 问题答案: 您可以使用Java6中的脚本引擎,并选择任何流行的脚本语言,例如Scala,Ruby,Python,Groovy和Jav

  • 问题内容: 假设我有以下表达式 Eclipse警告我,布尔表达式的第二个短语中可能为空。但是,我知道有些人会在第一个条件失败的情况下完全退出布尔表达式。Java是否正确?还是不能保证评估顺序? 问题答案: 但是,我知道有些人会在第一个条件失败的情况下完全退出布尔表达式。Java是否正确? 是的,这就是所谓的短路评估。操作员喜欢和是执行此类操作的操作员。 还是不能保证评估顺序? 不,可以保证评估的顺

  • 问题内容: 我需要在Javascript中评估用户输入的算术表达式,例如“ 2 *(3 + 4)”,但出于安全原因,我不想使用它。 我可以去除所有不是数字或运算符的字符,但是我不确定这是否安全,如果用户可以使用,,等功能,那会很好。 是否有进行算术表达式评估的Javascript库? 问题答案: 您可以尝试使用JavaScript Expression Evaluator: 该库是Raphael

  • 问题内容: 什么是实现将采用字符串并根据运算符优先级输出结果的python程序的最佳方法(例如:“ 4 + 3 * 5”将输出19)。我在谷歌上寻找解决这个问题的方法,但是它们都太复杂了,我正在寻找一个(相对)简单的方法。 澄清:我需要比eval()稍微先进的东西-我希望能够添加其他运算符(例如,最大运算符-4 $ 2 = 4),或者,我对此在学术上比对专业更感兴趣-我想知道 该怎么 做。 问题答

  • 本文向大家介绍评估后缀表达式,包括了评估后缀表达式的使用技巧和注意事项,需要的朋友参考一下 为了求解数学表达式,我们需要前缀或后缀形式。将中缀转换为后缀后,我们需要后缀评估算法来找到正确的答案。 在这里,我们还必须使用堆栈数据结构来解决后缀表达式。 从后缀表达式中,找到一些操作数后,将它们压入堆栈。找到某个运算符后,将从堆栈中弹出两个项目,并按正确的顺序执行操作。之后,结果也被压入堆栈中以备将来使

  • 我理解经典例子的问题 但我无法说服自己以下是有效的还是无效的 我知道'foo(i)'和'i'的求值顺序是不确定的,但是'评估'到底是什么意思?也就是说bar的第二个参数总是42,或者'i'的当前值可以在foo改变它之前被传入吗?