2010-03-21 1 views
2

Derby에서 다음 쿼리가 실패하는 이유를 알고 있습니까?Derby 용 SQL delete 문은 NULL이 허용되지 않습니까?

Error: Syntax error: Encountered "null" at line 3, column 3. 
SQLState: 42X01 
ErrorCode: -1 

는 SQL은 내가 iBatis를 ORM 레이어 설정에 작성한 SQL을 기반으로 자바 프로그램에서 생성되는 :

delete from MyTable 
where 
((null = null) or (col1 = null)) OR 
((102 = null) or (col2 = 102))) 

나는 다음과 같은 오류가 발생합니다. 당신은 내가 말할려고하는 것은 매개 변수 null가 아닌 경우, 다음 매개 변수에 대해 열 값을 테스트하는 것입니다 볼 수 있듯이

delete from MyTable 
where 
((? = null) or (col1 = ?)) OR 
((? = null) or (col2 = ?))) 

+0

감사합니다. 나는 SQL이 iBatis orm 계층에 의해 자바 프로그램에서 생성되고 있다고 덧붙여 야한다. prepared statement는 MyTable에서 delete (where (? = null) or (col1 =?)) 또는 ((?? null) or (col2 =?))) 다음과 같습니다. 파라미터가 null가 아닌 경우, 파라미터에 대해 렬 치를 테스트합니다. 나는 원래의 질문을 수정하여 이것을 분명히했다 (* 잘하면 *). –

답변

3

나는 무엇을 믿고 다음과 같이 준비된 문장은 당신이 원하는 것입니다 :

 
DELETE FROM `name_of_table` WHERE `name_of_column` IS NULL 

SQL은 NULL을 제외하고, 대부분의 값 =value을 사용할 수 있습니다이 정말 이상한 속성이 있습니다.

+1

이상한 것은 없습니다. NULL! = NULL은 삼중 논리의 핵심 부분입니다. soothing이 알려지지 않은 경우 (NULL) 다른 알려진 값과 동일하지 않습니다. – TomTom

+0

@TomTom, 이상한 점은 SQL이 NULL 값에 대해서만 "="대신 "IS"를 사용한다는 것입니다. –

+0

사실 아니요. 그것은 삼중 논리의 논리적 결론이다. – TomTom

1

(당신이 null = null이 사실로 예상되는 경우는 일반적으로 SQL에 없을 것이다,) 절은이 모든 행을 일치해야합니다 제안의 첫 번째 부분 - 당신이 정말로 전체 테이블의 내용을 삭제 하시겠습니까? 마찬가지로 102 = null은 102라는 열을 얻지 못한다면 어떤 기괴한 비교 방법이 될 수 있습니다 (적어도 이 금지됩니다).

무엇을 실제로 찾으려고합니까? 다른 사람들이 말했듯이 "null입니다"를 사용하여 null에 대한 값을 비교해야하지만 질문에 다소 큰 문제가있는 것처럼 들립니다. 성취하고자하는 바를 알려 주실 수 있다면보다 나은 질의를 작성하도록 도와 드리겠습니다.

+0

쿼리는 매개 변수화 된 쿼리이며, * 매개 변수 *가 null이고 조건을 무시하면 내가 말하고자하는 작업이 있습니다. 이 문제를 명확히하기 위해 질문을 편집했습니다 *. –

+0

@leftbrainlogic : 첫 번째와 세 번째 매개 변수는 열 이름이나 값을 의미합니까? 매개 변수가 값인 경우 무효를 직접 확인하고 SQL에 데이터를 전달하는 대신 그에 따라 쿼리를 조정할 수 있습니다. –

2

SQL에서 인수 중 하나가 NULL 인 연산자는 모두 NULL으로 평가됩니다. 따라서 1 + NULLNULL, MAX(NULL)NULL 등입니다. 가장 중요한 점은 X = NULL항상은 X가 NULL 인 경우에도 NULL으로 표시됩니다. 즉 NULL = NULLNULL이 아니라 true이됩니다.

정확한 오류는 NULL 키워드가 비교의 왼쪽에 실제로 유효하지 않다는 것입니다. 그러나 당신이 그것을 고쳤더라도, 당신은 여전히 ​​당신의 행이 전혀 일치하지 않는다는 것을 알게 될 것입니다. 다른 사람들이 말했듯이, 무언가가 null인지 아닌지를 결정할 때 사용할 정확한 비교는 에서와 같이 IS NULL입니다.

0

흠, 아직 좋은 대답을 얻지 못한 것 같습니까? 나는 NULL 값의 더비를 처리 할 때와 비슷한 문제가 있습니다

Derby's handling of NULL values

사실은 더비는 NULL과 관련된 유형을 필요로한다는 것이다. SQL을 직접 작성한 경우 수행해야 할 작업은 cast(null to int) 또는 이와 비슷한 작업입니다. 불행히도, 당신이 언급했듯이, SQL은 iBATIS에 의해 생성되었으므로 업그레이드가 효과가있을 수 있습니까? 그 동안 iBATIS가이를위한 수정을 했습니까?

그렇지 않으면이 당신을 도울 수 있습니다 답변에 대한

http://anydoby.com/jblog/en/java/143