2

有谁知道为什么以下查询在 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 是在基于我写入 iBatis ORM 层配置的 SQL 的 java 程序中生成的。准备好的语句如下:

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

如您所见,我想说的是,如果参数不为空,则根据参数测试列值

4

4 回答 4

3

我相信你想要的是:

从 `name_of_table` 中删除,其中 `name_of_column` 为 NULL

SQL 有一个非常奇怪的属性,您可以在其中使用=value大多数值,但 NULL 除外。

于 2010-03-21T09:09:00.157 回答
2

在 SQL 中,任何一个参数为的运算符的NULL计算结果为NULL. 所以1 + NULLNULLMAX(NULL)NULL,等等。最重要的是,在您的情况下,X = NULL 始终评估为NULL,即使 XNULL本身就是(即NULL = NULL评估为NULLnot true)。

您得到的确切错误是关键字NULL在比较的左侧实际上无效。但即使你解决了这个问题,你仍然会发现你的行都不匹配。正如其他人所说,尝试确定某物是否为 null 时使用的正确比较是IS NULL,如X IS NULL.

于 2010-03-21T09:27:04.317 回答
1

where 子句的第一部分建议它应该匹配每一行(如果你希望null = null它是真的,它通常不会在 SQL 中) - 你真的想删除整个表的内容吗?同样102 = null是一种非常奇怪的比较,除非你有一个名为 102 的列(我至少希望被禁止)。

你想真正匹配什么?正如其他人所说,您应该使用“is null”将值与 null 进行比较 - 但听起来您的查询有更大的问题。如果您能告诉我们您想要达到的目标,我们或许可以帮助您更好地编写查询。

于 2010-03-21T09:09:54.703 回答
0

嗯,你好像还没得到好的答案?我对 Derby 的值处理有类似的问题NULL

Derby 对 NULL 值的处理

事实上,Derby 需要一个与 NULL 关联的类型。如果您自己编写 SQLcast(null to int)或类似的东西,您将不得不做的事情。不幸的是,正如您所提到的,SQL 是由 iBATIS 生成的,所以也许升级可能有效?同时,iBATIS 是否为此创建了修复程序?

否则,这可能会帮助您:

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

于 2011-02-05T09:46:16.117 回答