插入 NULL 值最方便的方法是在输入文件中使用 NULL 字节并在 WITH NULL BYTE 语句的列规范中指定 LOAD TABLE。
这通过使用 "x00" 或 "x01" 终止输入文件中的每个数据字段来完成。
使用 "x01" 终止输入文件中的数据字段指示装载将 NULL 插入相应列。例如:
create table d1 ( c1 date );
load table d1 ( c1 binary with null byte ) from 'filename' quotes off escapes off format binary;
如果装载输入文件的内容是 000b32cb00000b32cc00,则两行将装载到表中。第一行是 2009 年 5 月 7 日,第二行是 2009 年 5 月 8 日。NULL 字节添加到输入文件中每个二进制日期之后。如果要将 NULL 值装载到第一行中,请在输入文件中将 NULL 字节的值更改为 "x01"。
000b32cb01000b32cc00再例如,若要将值 32769 装载到 NUMERIC(20) 列中,输入文件应包含:
0x0102 0x5000 0x0ad1 0x0003 0x0000 0x00这包括 NULL 字节。
要将 23456789012345678.12 装载到以 NUMERIC(19,2) 定义的列中,装载输入文件应包含:
0x0106 0x4f00 0x04b0 0x162e 0x04d2 0x1ed2 0x0d80 0x0002 0x0000 0x00数字后跟 NULL 字节 (0x00)。
在表示该数值数量的结构的数字数组中,有七个无符号短型值(编号 0 - 6)。"digits[0]" 包含重要性最低的数字:
digits[0] = 0x04b0 (decimal 120)
digits[1] = 0x162e (decimal 5678)
digits[2] = 0x04d2 (decimal 1234)
digits[3] = 0x1ed2 (decimal 7890)
digits[4] = 0x0d80 (decimal 3456)
digits[5] = 0x0002 (decimal 2)
digits[6] = 0x0000
装载到表列中时,列规范的 NULL 部分指示如何将某些输入值视为 NULL 值。这些字符可能包括 BLANKS、ZEROS 或您定义的任何其它文字列表。当指定空值或从源文件读取空值时,目标列必须能够包含 NULL。
ZEROS 的含义如下:
NULL。
NULL(ZEROS) 永远不会导致列变为 NULL。NULL('0') 导致列变为 NULL。例如,装载: CREATE TABLE t1 ( c1 INT, c2 INT );查看使用 big-endian 字节排序的输入数据文件:od -x data.inp3030 3030 0000 04d2执行:LOAD TABLE t1 ( c1 ASCII(4) NULL( '0000' ), c2 BINARY )FROM 'data.inp' FORMAT BINARY QUOTES OFF ESCAPES OFF;结果:SELECT * FROM t1;c1 c2NULL 1234
NULL(ZEROS) 永远不会导致列变为 NULL。
NULL('0') 导致列变为 NULL。例如,装载: CREATE TABLE t1 ( c1 INT, c2 INT );查看使用 big-endian 字节排序的输入数据文件:od -x data.inp3030 3030 0000 04d2执行:LOAD TABLE t1 ( c1 ASCII(4) NULL( '0000' ), c2 BINARY )FROM 'data.inp' FORMAT BINARY QUOTES OFF ESCAPES OFF;结果:SELECT * FROM t1;c1 c2NULL 1234
NULL(ZEROS) 导致列变为 NULL。NULL('0') 永远不会导致列变为 NULL,例如,装载: CREATE TABLE t1 ( c1 INT, C2 INT );查看使用 big-endian 字节排序的输入数据文件:od -x data.inp0000 0000 0000 04d2执行:LOAD TABLE t1 ( c1 ASCII(4) NULL( zeros ), c2 BINARY )FROM 'data.inp' FORMAT BINARY QUOTES OFF ESCAPES OFF;结果:SELECT * FROM T1;c1 c2NULL 1234再例如,如果 LOAD TABLE 语句包含 col1 date( 'yymmdd' ) null(zeros) 并且要装载的数据为 000000,您会收到一个错误,指示 000000 无法转换为 DATE(4)。若要使 LOAD TABLE 在数据为 000000 时在 col1 中插入空值,请将 NULL 子句编写为 null('000000'),或将数据修改为相同数目的二进制零并使用 NULL(ZEROS)。
NULL(ZEROS) 导致列变为 NULL。
NULL('0') 永远不会导致列变为 NULL,例如,装载: CREATE TABLE t1 ( c1 INT, C2 INT );查看使用 big-endian 字节排序的输入数据文件:od -x data.inp0000 0000 0000 04d2执行:LOAD TABLE t1 ( c1 ASCII(4) NULL( zeros ), c2 BINARY )FROM 'data.inp' FORMAT BINARY QUOTES OFF ESCAPES OFF;结果:SELECT * FROM T1;c1 c2NULL 1234再例如,如果 LOAD TABLE 语句包含 col1 date( 'yymmdd' ) null(zeros) 并且要装载的数据为 000000,您会收到一个错误,指示 000000 无法转换为 DATE(4)。若要使 LOAD TABLE 在数据为 000000 时在 col1 中插入空值,请将 NULL 子句编写为 null('000000'),或将数据修改为相同数目的二进制零并使用 NULL(ZEROS)。
在二进制装载过程中装载 NULL 值的另一种方法是,如果目标列接受空值,则不为 LOAD TABLE 语句中的列提供数据。例如:
CREATE TABLE t1 ( c1 INT, c2 INT );
LOAD TABLE T1 ( c2 BINARY ) FROM 'data.inp'
FORMAT BINARY
QUOTES OFF
ESCAPES OFF;
SELECT * FROM T1;
c1 c2
NULL 1234
NULL 1234
查看使用 big-endian 字节排序的输入数据文件:
od -x data.inp
0000 04d2 0000 04d2