有人知道为什么以下查询在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,则根据参数
测试列值答案 0 :(得分:3)
我相信你想要的是:
DELETE FROM `name_of_table` WHERE `name_of_column` IS NULL
SQL有这个非常奇怪的属性,你可以使用=value
和大多数值,除了NULL。
答案 1 :(得分:2)
在SQL中,其中一个参数为NULL
的运算符求值为NULL
。因此1 + NULL
为NULL
,MAX(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)
NULL
值有类似的问题:
Derby's handling of NULL values
事实是Derby需要一个与NULL相关联的类型。如果你自己编写SQL,你需要做的是cast(null to int)
或类似的东西。不幸的是,正如你所提到的,SQL是由iBATIS生成的,所以升级可能有用吗?同时,iBATIS是否为此创建了一个修复程序?
否则,这可能会对您有所帮助: