КАК написать запрос select на Java с использованием jdbc, где нужно проверить, равен ли СТОЛБЕЦ NULL?

#java #oracle #jdbc

#java #Oracle #jdbc

Вопрос:

Пытаюсь записать условие, при котором ind равен null в запросе select на java, используя драйвер jdbc oracle.

код :

Выполнено все подключение к БД

 info.add("CN");
info.add("NULL");
  

Пробовал:

 ResultSet rs1 = st.executeQuery("select COUNT(*) from TABLENAME where A='"   info.get(i)    " and  ind is'"  info.get(i 1)   " '");
  

Примечание: использование JDBC API драйвера oracle.

Берем нулевое значение из списка массивов. но оно не извлекает правильные значения из базы данных.

код:

Выполнено все подключение к БД

 info.add("CN");
info.add("NULL");

ResultSet rs1 = st.executeQuery("select COUNT(*) from TABLENAME where A='"   info.get(i)    " and  ind IS '"  info.get(i 1)   " '");
  

Я ожидаю, что результат будет таким, как count (количество строк):

Базовый sql-запрос, если используется в DB:

 select COUNT(*) 
from TABLENAME 
where A= 'a'   
 and  ind IS null;
  

Комментарии:

1. что такое тип данных info

2. Не объединяйте подобные значения в строку SQL. Научитесь правильно использовать PreparedStatement

Ответ №1:

Первая обработка NULL отличается от обработки значения:

 ind IS NULL
ind = '...'
  

Это затрудняет использование подготовленного оператора. Но PreparedStatement следует использовать не только для обеспечения безопасности (против SQL-инъекции), но и для экранирования одинарных кавычек и тому подобного. И безопасен для типов в том смысле, что использует типы и преобразования.

У Oracle SQL есть дефект, заключающийся в том, что он не различает NULL и «, поэтому вместо этого вы могли бы использовать «. Oracle независимый был бы:

 // Typed fields:
String a = ...;
int n = ...;
String ind = null;

String sql = ind == null
    ? "select COUNT(*) from TABLENAME where A=? and n=? and ind is null"
    : "select COUNT(*) from TABLENAME where A=? and n=? ind = ?";
try (PreparedStatement stmt = new PreparedStatement(sql)) {
   stmt.setString(1, a);
   stmt.setInt(2, n);
   if (ind != null) {
       stmt.setString(3, ind);
   }
   try (ResultSet rs = stmt.executeQuery()) {
       long count = rs.next() ? rs.getLong(1) : 0L;

       return count;
   }
}
  

Оператор Try-with-resources закрывает и результирующий набор, также с выданным исключением или возвратом в середине.

Для общего списка объектов можно использовать один для цикла построения шаблона SQL, а второй для настройки полей PreparedStatement.

Ответ №2:

Эта часть:

 " and  ind is'"  info.get(i 1)   " '");
  

генерирует следующий SQL:

   and ind is 'NULL ';
  

что неправильно, потому что это выдаст ошибку:

ORA-00908: отсутствует ключевое слово NULL

Вам нужно изменить это на:

 " and ind is "  info.get(i 1));
  

но тогда это больше не будет работать для ненулевых значений.