gpt4 book ai didi

sql - Derby 对 NULL 值的处理

转载 作者:行者123 更新时间:2023-12-04 23:31:13 26 4
gpt4 key购买 nike

我是 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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com