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 或更高版本中则会发生数据格式错误。
以下两个示例都会发生数据格式错误。
INSERT INTO table1 VALUES('');
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” 运算符查询。
SELECT * FROM table1 WHERE a IS 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 值(或空字符串)时,查找时的操作如下表所示。
搜索条件 | NULL 值 | 空字符串 | 其它 |
---|---|---|---|
IN (NULL) | ✓ | ✓→× | × |
NOT IN (NULL) | × | ×→✓ | ✓ |
IN ('') | ✓→× | ✓ | × |
NOT IN ('') | × | × | ✓ |
搜索条件 | 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 兼容)相同的查找结果,需要进行以下设置。
未设置用户信息或组信息时,设置为返回空字符串
将 Enterprise Manager 的[服务器设置]界面的[其他]选项卡中的 GetInfoSearchType 设置为 “1”。
将将数据的空字符串原样迁移(VARCHAR 型)
迁移数据库时,在 dwdb_convert 命令的<blank_mode>中指定 “0”。
将数据的 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 函数”。