КАК написать запрос на выборку в java, используя jdbc, где нужно проверить, не равна ли COLUMN NULL? - PullRequest
2 голосов
/ 27 марта 2019

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

код:

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

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 оракула. ​​

Взяв нулевое значение из массива list.но он не извлекает правильные значения из БД.

код:

Сделано все подключения БД

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) + " '");

Я ожидаю вывод, например, количество (без строк):

Запрос BAsic sql, если используется в БД:

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

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Первая обработка 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.

0 голосов
/ 27 марта 2019

Эта часть:

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

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

  and ind is 'NULL ';

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...