NULL не разрешен, это оператор удаления SQL (для Derby)? - PullRequest
2 голосов
/ 21 марта 2010

Кто-нибудь знает, почему следующий запрос завершается неудачей в 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 = ?)))

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

Ответы [ 4 ]

3 голосов
/ 21 марта 2010

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

DELETE FROM `name_of_table` WHERE `name_of_column` IS NULL

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

2 голосов
/ 21 марта 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.

1 голос
/ 21 марта 2010

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

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

0 голосов
/ 05 февраля 2011

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

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

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

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

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

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