JDBC запрос - диапазоны дат в качестве параметров - PullRequest
0 голосов
/ 17 марта 2010

Я хотел бы написать один оператор 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 ?

Я рассмотрю использование временной таблицы, еслиэто будет проще и эффективнее.

спасибо за помощь!

Ответы [ 2 ]

3 голосов
/ 17 марта 2010

Готовая выписка имеет фиксированное количество параметров. В некоторых случаях (например, IN ()) вы можете работать с массивами, чтобы решить эту проблему, но в вашем случае это не сработает.

Временная таблица выполнит эту работу, просто включите ON (mydate BETWEEN startdate AND enddate), когда у вашей временной таблицы есть столбцы «startdate» и «enddate». Вставка и удаление строк из вашей временной таблицы изменяет количество параметров.

2 голосов
/ 17 марта 2010

Вам просто нужно сгенерировать строку 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();
        // ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...