2012-06-12 4 views
3

Oracle 11g 데이터베이스에 대해 JDBC에서 PreparedStatement 쿼리를 수행하고 있는데 null 매개 변수를 전달한 결과가 "is null"을 정의하는 것과 다릅니다. 쿼리 자체. 예를 들어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 is null"의 경우입니다.

+1

를 사용 NULL 값을 비교할 수 없기 때문에 하나 내가 [여기]를 자세히 대답 (HTTP보다이 문제를 해결하기 위해 청소기 방법을 찾을 수 없습니다 작동하지 않습니다 "WHERE col2 =? OR (col2 IS NULL AND? IS NULL)"일 수 있습니다. (예 : .com/questions/4215135/how-to- ". –

답변

6

이것은 Java와는 아무런 관련이 없습니다. 실제로 이것은 Oracle에서 NULL이 작동하는 방식입니다.

NULL (심지어 NULL)과 비교할 때 NULL은 항상 거짓이며, IS NULL을 사용해야합니다.

이것은 또한 어떤 행을 반환하지 않습니다 :

SELECT col1 FROM tbl WHERE col2 = NULL 

또는

SELECT col1 FROM tbl WHERE NULL = NULL 
+0

단일 SQL 문에서 조건부로이를 표현할 수있는 방법이 있습니까? –

+0

당신은 SQL 문을 변경하지 않고 Oracle 및 다른 데이터베이스에서 작동하도록 만드는 방법, 또는 null 또는 null이 아닌 값을 찾기 위해 하나의 명령문을 작성하는 방법을 의미합니까? – Bill

+1

매개 변수 입력을 기반으로 null 또는 null이 아닌 값을 찾는 명령문을 작성하는 방법. "WHERE col2 =? OR (col2 IS NULL AND? IS NULL)"을 추가하는 것이 가장 현명한 옵션 인 것 같습니다. 변수를 두 번 입력해야하는 것은 두 개의 별도 쿼리를 정의하고 유지 관리하는 것보다 낫습니다. 원하는 옵션이 있습니까? –

2

내가 ps.setNull(1, java.sql.Types.INTEGER)가 데이터베이스에 NULL 데이터 값을 삽입하는 의미되었다고 생각합니다.

SQL 쿼리에서 NULL 데이터 값을 검색하는 경우 IS NULL을 사용해야합니다. // 유래 :

결국, 일을 col2 = NULL=

+0

한 사례에서 NULL을 검색하려고하거나 다른 경우에 null이 아닌 값을 검색하려고하지만 입력 매개 변수를 기반으로하고 싶다면 어떻게해야합니까? –

+0

if-else 문을 사용하십시오. (값 == NULL) 다른 { //이 SQL 쿼리 사용} 경우 { 을 // 다른 SQL 쿼리 사용} 나는 그것이 훨씬 더 복잡한 쿼리 및 재정의으로 쿼리를 여러 번 정의 피하려고했다 –

+0

을 그것은 미래의 유지 보수 두통을 추가 할 것입니다."WHERE col2 =? OR (col2 IS NULL AND? IS NULL)"줄을 따라 쿼리에 논리를 추가하면 트릭을 수행해야합니다. –

관련 문제