当前位置: 首页 > 面试题库 >

Derby对NULL值的处理

洪建茗
2023-03-14
问题内容

我是Derby的新手,我注意到,就null值而言,我面临着与使用DB2
RDBMS时类似的问题。Derby文档指出,null值必须具有与之关联的类型(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)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之类的强类型数据库引擎),或者该引擎将进行隐式类型转换(如果可能)。



 类似资料:
  • 我正在研究从数据库中获取数据并构建协议buff消息的东西。鉴于某些字段可以从数据库中获取空值的可能性,我将在尝试构建协议buff消息时获得空指针异常。了解到线程http://code.google.com/p/protobuf/issues/detail?id=57的原型不支持null,我想知道处理NPE被抛出的唯一方法是否是将手动检查插入到与原型对应的java文件中,如下所示! 那么,有人能澄清

  • 我有一个联系人列表,显示在API响应的Future Builder列表视图中,我在服务器中总共有23个联系人,但我想去掉其名字和姓氏为NULL的所有联系人。 在处理空异常之前:单击此处 代码: 处理空异常后:单击此处 正如您从添加的代码和图像中看到的,为了处理异常,我只为所有名为null的联系人返回了一个空的容器,但现在我想更改它。我如何才能使那些名为firstname和lastname的联系人不

  • 我有一个一对一的关系之间的用户(pengganas)表和角色表,但当我在控制器中访问它返回null和列未找到 Route.php PenggunaController.php 使用App\Pengguna; 迁移 创建_penggunas_表 创建\u角色\u表 模型 Pengguna.php Role.php 因此,在PenggunaController.php的方法索引上,我正在获取id=3的

  • 问题内容: 我有以下代码: 然后,我尝试: 返回行抛出错误: {“将值\“ \”转换为类型’System.Double’时出错。“} 在线上有许多解决方案建议使用空值类型创建自定义,但这对我不起作用。我不能指望json是某种格式。我无法控制列数,列类型或列名。 问题答案: 您可以提供设置来告诉它如何处理空值(在这种情况下,还有更多):

  • 我试图使用Spring Data JDBC持久化一个包含嵌入式对象的对象。它不会被保存,因为它没有通过NULL检查。 我创建了一个外部类来持久化。 有什么方法可以保存一个空的/空的嵌入对象吗?

  • 我有时区POJO如下: 我在Spring Controller中有如下updateTimeZone方法: 当我通过以下请求时: 然后,当映射到POJO时,它会自动将其他值转换为默认值,并变为: 因此,当我如下更新此POJO时 它自动覆盖TimeZone=null和小时差异=0.0, 那么有没有什么方法可以让我在@Request estbody中的TimeZoneDto只包含我在请求JSON中传递的