Подтвердить что ты не робот

Связывание нулевой переменной в PreparedStatement

Я клянусь, что это работало, но это не в этом случае. Я пытаюсь сопоставить col1, col2 и col3, даже если один или несколько из них имеют значение null. Я знаю, что на некоторых языках мне приходилось прибегать к обходам вроде ((? is null AND col1 is null) OR col1 = ?). Это требуется здесь?

        PreparedStatement selStmt = getConn().prepareStatement(
                "SELECT     * " +
                "FROM       tbl1 " +
                "WHERE      col1 = ? AND col2 = ? and col3 = ?");
        try
        {
            int col = 1;
            setInt(selStmt, col++, col1);
            setInt(selStmt, col++, col2);
            setInt(selStmt, col++, col3);
            ResultSet rs = selStmt.executeQuery();
            try
            {
                while (rs.next())
                {
                   // process row
                }
            }
            finally
            {
                rs.close();
            }
        }
        finally
        {
            selStmt.close();
        }

   // Does the equivalient of stmt.setInt(col, i) but preserves nullness.
    protected  static void setInt(PreparedStatement stmt, int col, Integer i)
    throws SQLException
    {
        if (i == null)
            stmt.setNull(col, java.sql.Types.INTEGER);
        else
            stmt.setInt(col, i);
    }
4b9b3361

Ответ 1

Это может зависеть от драйвера JDBC, но, по большей части, да, вам нужно будет использовать более расширенную форму, показанную выше.

Подготовленные JDBC операторы обычно относительно тонкие обертки вокруг собственной реализации параметризованного запроса, то есть запроса с? вместо параметров передаются компилятору запросов и компилируются, поэтому позже, когда вы вызываете stmt.executeQuery(), инструкция не может быть отрегулирована с column = ? до column IS NULL. Это не столько ограничение JDBC, сколько семантика NULL в SQL. Для SQL x = NULL есть undefined as is x <> NULL.

Тем не менее, некоторые драйверы JDBC могут нарушать понятие NULL -ity в SQL и разрешать setNull() преобразовывать инструкцию из = ? в IS NULL, это было бы очень нестандартное поведение (хотя это могло бы легко выполнить путем написания своего рода метода предварительной обработки запросов).

Ответ 2

Какую базу данных вы используете?

Но, по крайней мере, с Oracle, равенство (и неравенство) никогда не соответствует NULL, вы должны писать IS NOT NULL.

Ответ 3

Обычно что-то, равное NULL, всегда ложно (даже NULL, поэтому SELECT * FROM tbl WHERE NULL=NULL; будет пустым набором), поэтому вам, вероятно, нужно сделать это длинным путем, если вы хотите принять нулевое равенство, подобное этому

Ответ 4

Я знаю, что это возможно слишком поздно, но только ради этого взломать Oracle, который, как мне кажется, работает:

SQL:

SELECT.....FROM....WHERE NVL(CUST_ID,0)=? AND NVL(vendor_id,0)=?

И в коде, где вы выполняете вызов jdbc, выполните следующие действия:

pstmt.setString(1, ( xxo.getCustId().equals("")) ? "0":xxo.getCustId());
pstmt.setString(2, ( xxo.getVendId().equals("")) ? "0":xxo.getVendId());
rs = pstmt.executeQuery();