Является ли NULL недопустимым оператором удаления SQL (для Derby)?

Кто-нибудь знает, почему следующий запрос не работает в Дерби?

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

Я получаю следующую ошибку:

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

SQL создается в java-программе на основе SQL, который я записал в конфигурацию слоя iBatis ORM. Подготовленное заявление выглядит следующим образом:

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

Как видите, я пытаюсь сказать, что если параметр не равен нулю, тогда проверьте значение столбца на соответствие параметру


person Community    schedule 21.03.2010    source источник
comment
Спасибо за ответы. Я должен был добавить, что sql создается в java-программе слоем iBatis orm. Подготовленный оператор выглядит следующим образом: удалить из MyTable, где ((? = null) или (col1 = ?)) ИЛИ ((? = null) или (col2 = ?))) Как вы можете видеть, что я пытаюсь сказать, это что, если параметр не равен нулю, проверьте значение столбца на соответствие параметру. Я отредактировал исходный вопрос, чтобы прояснить это (надеюсь).   -  person    schedule 21.03.2010


Ответы (4)


Я считаю, что вы хотите:

DELETE FROM `name_of_table` WHERE `name_of_column` IS NULL

SQL имеет очень странное свойство, когда вы можете использовать =value с большинством значений, кроме NULL.

person Michael Aaron Safyan    schedule 21.03.2010
comment
Ничего странного. NULL != NULL является основной частью троичной логики. Если что-то неизвестно (NULL), оно не идентично какому-то другому неизвестному значению. - person TomTom; 21.03.2010
comment
@TomTom, странно то, что SQL использует IS вместо = только для значения NULL. - person Michael Aaron Safyan; 21.03.2010
comment
Вообще-то, нет. tЭто логическое завершение тринарной логики. - person TomTom; 21.03.2010
comment
@TomTom, это ни логично, ни нелогично ... все зависит от значения, которое мы придаем синтаксису. По моему собственному мнению, странно, что специальные случаи SQL имеют значение NULL таким образом, потому что предполагаемое значение такого утверждения очевидно и недвусмысленно, а большинство других языков с понятием null не требуют специального синтаксиса для определения того, является ли что-то недействительным. нулевой. - person Michael Aaron Safyan; 22.03.2010

В SQL любой оператор, один из аргументов которого равен NULL, оценивается как NULL. Итак, 1 + NULL — это NULL, MAX(NULL) — это NULL и так далее. Самое главное, что в вашем случае X = NULL всегда оценивается как NULL, даже если X сам является NULL (то есть NULL = NULL оценивается как NULL, а не true).

Точная ошибка, которую вы получаете, заключается в том, что ключевое слово NULL на самом деле недействительно в левой части сравнения. Но даже если вы исправите это, вы все равно обнаружите, что ни одна из ваших строк никогда не совпадает. Как уже говорили другие, правильное сравнение, которое следует использовать при попытке определить, является ли что-то нулевым, - это IS NULL, как в X IS NULL.

person Dean Harding    schedule 21.03.2010

Первая часть предложения where предполагает, что оно должно соответствовать каждой строке (если вы ожидаете, что null = null будет истинным, чего обычно не будет в SQL) - вы действительно хотите удалить все содержимое таблицы? ? Точно так же 102 = null — довольно странный вид сравнения, если только вы каким-то образом не получили столбец с именем 102 (который, по крайней мере, надеюсь, запрещен).

Что вы пытаетесь на самом деле соответствовать? Как уже говорили другие, вы должны использовать "является нулевым" для сравнения значения с нулевым, но похоже, что у вашего запроса гораздо большие проблемы. Если бы вы могли рассказать нам, чего вы пытаетесь достичь, мы могли бы помочь вам написать запрос лучше.

person Jon Skeet    schedule 21.03.2010
comment
Запрос является параметризованным запросом, и я пытаюсь сказать, что если параметр имеет значение null, тогда игнорируйте условие. Я отредактировал вопрос, чтобы прояснить это, надеюсь. - person ; 21.03.2010
comment
@leftbrainlogic: должны ли первый и третий параметры быть именами столбцов или значениями? Если это значения, вы можете самостоятельно проверить их на недействительность и соответствующим образом скорректировать запрос, а не передавать данные в SQL. - person Jon Skeet; 21.03.2010

Хм, вы, кажется, еще не получили хороший ответ? У меня аналогичная проблема с обработкой Дерби значений NULL:

обработка Derby значений NULL

Дело в том, что Дерби нужен тип, связанный с NULL. Если бы вы сами написали SQL, вам нужно было бы сделать cast(null to int) или что-то в этом роде. К сожалению, как вы упомянули, SQL генерируется iBATIS, так что, может быть, сработает обновление? Создал ли iBATIS исправление для этого в то же время?

В противном случае это может помочь вам:

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

person Lukas Eder    schedule 05.02.2011