Skip to main content

2-3-5-5 NULL 值处理的差异

在 Ver. 2.x 中,是将 NULL 值作为空字符串处理,而在 Ver. 3.0 或更高版本中,会将 NULL 值与空字符串区分处理(但是在 Ver. 3.0~Ver. 3.0 SP3 中,也可以进行将 NULL 值作为空字符串处理的设置)。

本节将对以下 2 类版本中 NULL 值与空字符串的操作进行说明。

版本

NULL 值的处理

Ver. 2.x、Ver. 3.0~Ver. 3.0 SP3(2.x 兼容)*1

作为空字符串处理。

Ver. 3.0~Ver. 3.0 SP3(区别 NULL 值和空字符串)*2、Ver. 4.0 或更高版本

与空字符串区分处理。

*1指的是数据库的设置[是否区分NULL和空字符]是[2.x兼容]。

*2指的是数据库的设置[是否区分NULL和空字符]是[]。

导入 CSV 文件时的操作

导入目标项目的值为空字符串时,在 Ver. 2.x 和 Ver. 3.0~Ver. 3.0 SP3(2.x 兼容)中,始终作为空字符串导入。

在 Ver. 3.0~Ver. 3.0 SP3(区别 NULL 值和空字符串)、Ver. 4.0 或更高版本中,导入处理如下。

  • VARCHAR 型

    作为空字符串导入还是作为 NULL 值导入,取决于 Enterprise Manager 的[服务器设置]界面的[导入]选项卡中[CSV/Excel空字符串的处理](Ver. 3.0~Ver. 4.0 SP1 中为[CSV空字符串的处理])的设置。

  • 非 VARCHAR 型

    全部作为 NULL 值导入。

向非 VARCHAR 的类型中插入空字符串或与之进行比较时的操作

在 Ver. 2.x 和 3.0~Ver. 3.0 SP3(2.x 兼容)中,执行查找时可向非 VARCHAR 的数据类型中插入空字符串或与之进行比较。但是在 Ver. 3.0~Ver. 3.0 SP3(区别 NULL 值和空字符串)和 Ver. 4.0 或更高版本中则会发生数据格式错误。

以下两个示例都会发生数据格式错误。

1. 向包含 NUMERIC 型的列 “col1” 的表中插入空字符串的示例
INSERT INTO table1 VALUES('');


2. 将 NUMERIC 型的列 “col1” 与空字符串进行比较的示例
SELECT * FROM table1 WHERE col1 = '';


排序时的操作

在 Ver. 2.x 与 Ver. 3.0~Ver. 3.0 SP3(2.x 兼容)中,NULL 值将作为最小值处理。

而在 Ver. 3.0~Ver. 3.0 SP3(区别 NULL 值和空字符串)和 Ver. 4.0 或更高版本中,NULL 值会作为最大值处理,因此排序结果会发生变化。

参考

在 Ver. 4.0 或更高版本中,如要将 NULL 值作为最小值处理,请在 Enterprise Manager 的[服务器设置]界面的[数据库]选项卡中将[NULL排序顺序]设置为[最小]。

交叉统计表的统计项目为 NULL 时的操作

在 Ver. 2.x 与 Ver. 3.0~Ver. 3.0 SP3(2.x 兼容)中,即使交叉统计表的统计项目为 NULL,也会返回 “0”。

而在 Ver. 3.0~Ver. 3.0 SP3(区别 NULL 值和空字符串)和 Ver. 4.0 或更高版本中,NULL 值会作为 NULL 值返回,因此统计结果会发生变化。

参考

在 Ver. 4.0 或更高版本中,如要将 NULL 值显示为 “0”,请将 Enterprise Manager 的[服务器设置]界面的[其他]选项卡的 OLAPNullType 设置为 “1”。

查找时的操作

在 Ver. 2.x 与 Ver. 3.0~Ver. 3.0 SP3(2.x 兼容)中,通过 “=” 运算符查询 NULL 值。而在 Ver. 3.0~Ver. 3.0 SP3(区别 NULL 值和空字符串)和 Ver. 4.0 或更高版本中,通过 “IS NULL” 运算符查询。

3. 在 Ver. 3.0~Ver. 3.0 SP3(区别 NULL 值和空字符串)和 Ver. 4.0 或更高版本中,可查询 NULL 值的示例。
SELECT * FROM table1 WHERE a IS NULL;


4. 在 Ver. 3.0~Ver. 3.0 SP3(区别 NULL 值和空字符串)和 Ver. 4.0 或更高版本中,无法查询 NULL 值的示例。
SELECT * FROM table1 WHERE a = NULL;


未设置用户信息或组信息时的查找操作

使用 Dr.Sum Session 函数(GET_USER_INFO、GET_GROUP_INFO)后,可获取用户信息或组信息。

未设置用户信息或组信息时,默认返回 NULL 值。

但是,对于该 NULL 值的处理会与一般项目的 NULL 值有所不同。

一般情况下即使在 IN 子句中书写 NULL,也不会查找 NULL 值,但是如果在未设置用户信息或组信息的情况下书写 NULL 值,则会查找 NULL 值。

参考

在 Ver. 4.0 或更高版本中,对于未设置用户信息或组信息时返回 NULL 值还是空字符串,可在 Enterprise Manager 的[服务器设置]界面的[其他]选项卡的 GetInfoSearchType 中进行设置。“0” 返回 NULL 值,“1” 则返回空字符串。

用户信息或组信息为 NULL 值(或空字符串)时,查找时的操作如下表所示。

1. VARCHAR 型

搜索条件

NULL 值

空字符串

其它

IN (NULL)

✓→×

×

NOT IN (NULL)

×

×→✓

IN ('')

✓→×

×

NOT IN ('')

×

×



2. 非 VARCHAR 型

搜索条件

NULL 值

其它

IN (NULL)

×

NOT IN (NULL)

×



*查找条件括号中的内容表示 Dr.Sum Session 函数的返回值。

*表中的 ✓ 表示查找,× 表示不进行查找。

*存在 “→” 时,表示 “Ver. 2.x 与 Ver. 3.0~Ver. 3.0 SP3(2.x 兼容)中的操作” → “Ver. 3.0~Ver. 3.0 SP3 (区别 NULL 值和空字符串)和 Ver. 4.0 或更高版本中的操作”。

*不存在 “→” 时,所有版本中的操作都一样。

获取与 Ver. 2.x 或 Ver. 3.0~Ver. 3.0 SP3(2.x 兼容)相同的查找结果时

如要获取与 Ver. 2.x 或 Ver. 3.0~Ver. 3.0 SP3(2.x 兼容)相同的查找结果,需要进行以下设置。

  1. 未设置用户信息或组信息时,设置为返回空字符串

    将 Enterprise Manager 的[服务器设置]界面的[其他]选项卡中的 GetInfoSearchType 设置为 “1”。

  2. 将将数据的空字符串原样迁移(VARCHAR 型)

    迁移数据库时,在 dwdb_convert 命令的<blank_mode>中指定 “0”。

  3. 将数据的 NULL 值转换为空字符串(非 VARCHAR 型)

    迁移数据库后,在使用了 Dr.Sum Session 函数(GET_USER_INFO、GET_GROUP_INFO)的位置使用 NVL 函数将数据的 NULL 值转换为空字符串(例:NVL(TO_CHAR(NUM_COL1),'')=GET_USER_INFO(ENV1))。

    参考

    • 有关 NVL 函数,请参阅《Dr.Sum Server 管理员指南》的 “Dr.Sum Server SQL 参考篇” 的 “转换函数”。转换函数

    • 有关 Dr.Sum Session 函数(GET_USER_INFO、GET_GROUP_INFO),请参阅《Dr.Sum Server 管理员指南》的 “Dr.Sum Server SQL 参考篇” 的 “Dr.Sum Session 函数”。Dr.Sum Session 函数