【问题标题】:jdbc query - date ranges as parametersjdbc 查询 - 日期范围作为参数
【发布时间】:2010-03-17 06:16:34
【问题描述】:

我想编写一个 JDBC 语句,它可以处理任意数量的 NOT BETWEEN date1 AND date2 where 子句。

通过单个查询,我的意思是相同的 SQL 字符串将用于创建 JDBC 语句,然后提供不同的参数。

这是为了让底层框架可以有效地缓存查询(我以前被这个刺痛过)。

基本上,我想找到一个相当于

的查询
SELECT * FROM table WHERE mydate NOT BETWEEN ? AND ?
    AND mydate NOT BETWEEN ? AND ?
    AND mydate NOT BETWEEN ? AND ?
    AND mydate NOT BETWEEN ? AND ?

同时可以使用更少的参数:

SELECT * FROM table WHERE mydate NOT BETWEEN ? AND ?

或更多参数

SELECT * FROM table WHERE mydate NOT BETWEEN ? AND ?
    AND mydate NOT BETWEEN ? AND ?
    AND mydate NOT BETWEEN ? AND ?
    AND mydate NOT BETWEEN ? AND ?
    AND mydate NOT BETWEEN ? AND ?
    AND mydate NOT BETWEEN ? AND ?

如果这样更简单、更高效,我会考虑使用临时表。

感谢您的帮助!

【问题讨论】:

    标签: java sql postgresql jdbc


    【解决方案1】:

    准备好的语句具有固定数量的参数。在某些情况下(例如 IN() ),您可以使用数组来解决此问题,但在您的情况下,这将不起作用。

    临时表将完成这项工作,当您的临时表具有“startdate”和“enddate”列时,只需加入 ON(mydate BETWEEN startdate AND enddate)。从临时表中插入和删除行会改变参数的数量。

    【讨论】:

    • 数组在IN 中不起作用。您仍然需要自己自动生成占位符。
    • Array 的效果很好,但是您必须将 IN 转换为 = ANY(?)。发送字符串“{1,2,3}”作为参数,它工作正常。
    【解决方案2】:

    您只需要即时生成 SQL 字符串。例如

    public List<Data> find(List<BetweenDate> betweenDates) throws SQLException {
        StringBuilder sql = new StringBuilder("SELECT * FROM table WHERE ");
        for (int i = 0; i < betweenDates.size();) {
            sql.append("mydate NOT BETWEEN ? AND ?");
            if (++i < betweenDates.size()) sql.append(" AND ");
        }
    
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        List<Data> result = new ArrayList<Data>();
    
        try {
            connection = database.getConnection();
            statement = connection.prepareStatement(sql.toString());
            for (int i = 0; i < betweenDates.size(); i++) {
                preparedStatement.setObject((i * 2) + 1, betweenDates.get(i).getStartDate());
                preparedStatement.setObject((i * 2) + 2, betweenDates.get(i).getEndDate());
            }
            resultSet = statement.executeQuery();
            // ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 2019-08-16
      • 2014-12-17
      相关资源
      最近更新 更多