sql - Derby 对 NULL 值的处理

标签 sql null db2 derby strong-typing

我是 Derby 的新手,我注意到我遇到了与使用 DB2 RDBMS 时类似的问题 null值(value)观有关。 Derby 文档指出,null value 必须有一个与之关联的类型(DB2 最终在 9.7 版中摆脱了这种类型):

http://db.apache.org/derby/docs/10.7/ref/crefsqlj21305.html

现在,我试图找到一个 一般在这里解决这个问题,因为这将是我的数据库抽象库的一部分 jOOQ .下面的例子只是记录了这个问题。想想任何其他(更复杂)的例子。以下不起作用:

insert into T_AUTHOR (
  ID, FIRST_NAME, LAST_NAME, 
  DATE_OF_BIRTH, YEAR_OF_BIRTH, ADDRESS) 
select 
  1000, 'Lukas', 'Eder', 
  '1981-07-10', null, null 
from SYSIBM.SYSDUMMY1

这也不是(这是 jOOQ 实际完成的):
insert into T_AUTHOR (
  ID, FIRST_NAME, LAST_NAME, 
  DATE_OF_BIRTH, YEAR_OF_BIRTH, ADDRESS) 
select ?, ?, ?, ?, ?, ? 
from SYSIBM.SYSDUMMY1

因为两个null值没有与之关联的类型。解决方案是这样写:
insert into T_AUTHOR (
  ID, FIRST_NAME, LAST_NAME, 
  DATE_OF_BIRTH, YEAR_OF_BIRTH, ADDRESS) 
select 
  1000, 'Lukas', 'Eder', 
  '1981-07-10', cast(null as int), cast(null as varchar(500)) 
from SYSIBM.SYSDUMMY1

或者像这样,分别
insert into T_AUTHOR (
  ID, FIRST_NAME, LAST_NAME, 
  DATE_OF_BIRTH, YEAR_OF_BIRTH, ADDRESS) 
select 
  ?, ?, ?, ?, cast(? as int), cast(? as varchar(500)) 
from SYSIBM.SYSDUMMY1

但很多时候,在 Java 中,null 的类型应该被强制转换为未知:
  • 在此示例中,类型可以从 insert 子句派生,但对于更一般的用例,这可能会证明是复杂的或不可能的。
  • 在其他示例中,我可以为转换选择任何类型(例如始终转换为 int ),但这在本示例中不起作用,因为您不能放置 cast(null as int)值(value)成ADDRESS .
  • 使用 HSQLDB(这个问题的另一个候选者),我可以简单地写 cast(null as object)这在大多数情况下都有效。但是 Derby 没有 object类型。

  • 这个问题以前一直困扰着我使用 DB2,我还没有找到解决方案。有谁知道稳定 , 和 一般对于这些 RDBMS 中的任何一个,此问题的解决方案是什么?
  • Derby
  • DB2
  • 最佳答案

    如果在 INSERT 上使用 VALUES 子句,则不必强制转换 NULL 值:

    insert into T_AUTHOR (
      ID, FIRST_NAME, LAST_NAME, 
      DATE_OF_BIRTH, YEAR_OF_BIRTH, ADDRESS) 
    VALUES ( 
      1000, 'Lukas', 'Eder', 
      '1981-07-10', null, null 
    );
    

    这将像您期望的那样工作(即数据库可以确定 NULL 对应于一个整数和 varchar(500)。这在 DB2 和 Derby 中都有效(并且应该也可以在几乎所有其他数据库引擎中使用)。

    您也可以将 VALUES 与参数标记一起使用,而不必对它们进行 CAST。

    发出 insert into ... select from 时必须强制转换的原因语句是因为 SELECT 部分优先 - select 语句返回某些数据类型,无论它们是否与您尝试将它们插入的表兼容。如果它们不兼容,您将收到错误消息(对于 DB2 <= 9.5 等强类型数据库引擎),或者引擎将进行隐式类型转换(如果可能)。

    关于sql - Derby 对 NULL 值的处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4905826/

    相关文章:

    mysql - 如何使用索引改进我的sql select?

    mysql - sql查询计数连接中的记录数

    c# - 如何检查 Point3d 是否不为空?

    sql - 使用 DB2,我可以检查存储过程何时被修改吗?

    mysql - 计算 2 个纪元时间之间的差异,大表,优化具有 3 个索引

    c# - 使用 C# 获取数据库索引号时出错,显示 -1

    java - 类中的 Guice 注入(inject)字段不是由 Guice 创建的

    go - ioutil.ReadAll 惨遭失败

    在 db2 转换上加入 Mysql 更新

    java - 不指定用户名和密码的 DB2 连接