2012-06-12 2 views
3

Я работаю над запросом PreparedStatement в JDBC в отношении базы данных Oracle 11g и обнаруживаю, что результаты передачи нулевого параметра отличаются от определения «равно нулю» в сам запрос.JDBC setNull() против Oracle «null» производит разные результаты

Например, этот запрос:

String sql = "SELECT col1 FROM tbl WHERE col2 = ?"; 
PreparedStatement ps = conn.prepareStatement(sql); 
ps.setNull(1, java.sql.Types.INTEGER); 
ps.execute(); 

отличается от этого запроса:

String sql = "SELECT col1 FROM tbl WHERE col2 is null"; 
PreparedStatement ps = conn.prepareStatement(sql); 
ps.setNull(1, java.sql.Types.INTEGER); 
ps.execute(); 

Мне любопытно, почему это так, и как я могу избежать определения двух отдельных инструкций SQL для покрытия как «col2 = value», так и «col2 - null».

+1

Я не могу найти более рациональный способ решения этой проблемы, чем ответ подробно [здесь] (Http: // StackOverflow .com/questions/4215135/how-to-deal-with-maybe-null-values-in-a-readystatement? rq = 1), который будет «WHERE col2 =? OR (col2 IS NULL AND? IS NULL) ». –

ответ

6

Это не имеет ничего общего с Java, на самом деле, это то, как NULL работает в Oracle.

NULL всегда является ложным по сравнению с чем угодно (даже до NULL), вы должны использовать IS NULL.

Это также возвращает ни одной строки:

SELECT col1 FROM tbl WHERE col2 = NULL 

или даже

SELECT col1 FROM tbl WHERE NULL = NULL 
+0

Есть ли способ выразить это условно в одном выражении SQL? –

+0

Вы имеете в виду, как заставить его работать в Oracle и другой базе данных без изменения инструкции SQL или как написать один оператор для поиска нулевых или ненулевых значений? – Bill

+1

Как написать один оператор, который ищет нулевые или ненулевые значения на основе ввода параметров. Добавление «WHERE col2 =? ИЛИ (col2 IS NULL AND? NULL)» кажется наиболее разумным вариантом, требующим, чтобы я предоставлял переменную дважды, предпочтительнее определять и поддерживать два отдельных запроса. Есть ли предпочтительные варианты? –

2

Я считаю, что ps.setNull(1, java.sql.Types.INTEGER) предназначался для вставки значения данных NULL в базу данных.

Вы должны использовать IS NULL, если вы ищете NULL значения данных в запросе sql.

В конце концов, делать col2 = NULL не будет работать, потому что вы не можете сравнить для NULL значений с помощью =

+0

Что делать, если я хочу искать NULL в одном случае или ненулевое значение в другом случае, но я хочу сделать это на основе входного параметра? –

+0

используйте инструкцию if-else. если (значение == NULL) {// использовать этот SQL запрос } еще {// использовать другой SQL запрос } –

+0

Я пытался избежать определения в запросе несколько раз, так как это гораздо более сложный запрос и переопределение это добавило бы головную боль в будущем.Добавление логики в запрос по строкам «WHERE col2 =? OR (col2 IS NULL AND? IS NULL)» должно сделать трюк. –

Смежные вопросы