是不允许NULL是SQL删除语句(对于Derby)?

时间:2010-03-21 09:04:15

标签: java sql ibatis derby

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

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

正如您所看到的,我想说的是,如果参数不为null,则根据参数

测试列值

4 个答案:

答案 0 :(得分:3)

我相信你想要的是:

DELETE FROM `name_of_table` WHERE `name_of_column` IS NULL

SQL有这个非常奇怪的属性,你可以使用=value和大多数值,除了NULL。

答案 1 :(得分:2)

在SQL中,其中一个参数为NULL的运算符求值为NULL。因此1 + NULLNULLMAX(NULL)NULL,依此类推。最重要的是,在您的情况下,X = NULL 总是评估为NULL,即使X本身为NULL(即NULL = NULL评估为{ {1}}不是NULL)。

您得到的确切错误是关键字true在比较的左侧实际上无效。但即使你修复了这个问题,你仍然会发现你的行没有一个匹配。正如其他人所说,在尝试确定某些内容是否为空时使用的正确比较是NULL,如IS NULL中那样。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

Derby's handling of NULL values

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

否则,这可能会对您有所帮助:

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