【问题标题】:Is NULL not allowed is SQL delete statement (for Derby)?SQL delete 语句(对于 Derby)是否不允许 NULL?
【发布时间】:2010-03-21 09:04:15
【问题描述】:

有谁知道为什么以下查询在 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 = ?)))

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

【问题讨论】:

  • 感谢您的回答。我应该添加 sql 是由 iBatis orm 层在 java 程序中生成的。准备好的语句如下 delete from MyTable where ((? = null) or (col1 = ?)) OR ((? = null) or (col2 = ?))) 你可以看到我想说的是如果参数不为空,则根据参数测试列值。我已经编辑了原始问题以澄清这一点(希望)。

标签: java sql ibatis derby


【解决方案1】:

我相信你想要的是:

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

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

【讨论】:

  • 没什么奇怪的。 NULL != NULL 是三元逻辑的核心部分。如果 soeth 未知 (NULL),则它与其他未知值不同。
  • @TomTom,奇怪的是 SQL 使用“IS”而不是“=”仅用于 NULL 的值。
  • 其实没有。 t是三元逻辑的逻辑结论。
  • @TomTom,这既不合逻辑也不不合逻辑……这完全取决于我们选择赋予语法的含义。在我自己看来,SQL 以这种方式特例 NULL 是很奇怪的,因为这种语句的预期含义是显而易见且明确的,并且大多数其他具有 null 概念的语言不需要特殊的语法来确定某事是否为空。
【解决方案2】:

在 SQL 中,参数之一为 NULL 的任何运算符的计算结果为 NULL。所以1 + NULLNULLMAX(NULL)NULL,以此类推。最重要的是,在您的情况下,X = NULL 总是 计算结果为 NULL,即使 X 本身是 NULL(也就是说,NULL = NULL 计算结果为 NULL 而不是 true)。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 查询是参数化查询,我想说的是,如果 parameter 为空,则忽略该条件。我已经编辑了问题以澄清这一点希望
    • @leftbrainlogic:第一个和第三个参数是列名还是列值?如果它们是值,您可以自己检查无效性并相应地调整查询,而不是将数据传递给 SQL。
    【解决方案4】:

    嗯,你好像还没有得到好的答案?我在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-04
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      • 2018-09-10
      • 1970-01-01
      相关资源
      最近更新 更多