使用条件控制器sqlldr从多行加载数据

问题描述

我有一个csv文件,其中包含如下所述的数据:

 - Data1|data2|data3....
 - Data4|data5|data6....
 - Ctr|1|2
 - Lst|1|30
 - Lst|1|40
 - Lst|1|50
 - Data7|data8....
 - Ctr|2|3
 - Lst|2|60
 - Lst|2|70

我有一个表控件(data_type varchar, id_control varchar, Type_liste varchar, id_subcontrol varchar)

我正在使用sql loader填充表,我期望的结果是:

 - data_type | Id_control|Type_liste| Id_subcontrol
 - Ctrl      | 1         |  NULL    | 2
 - Lst       | 1         |  30      | NULL
 - Lst       | 1         |  40      | NULL
 - Lst       | 1         |  50      | NULL
 - Ctr       | 2         | NULL     | 3
 - Lst       | 2         |  60      | NULL
 - Lst       | 2         |  70      | NULL

我已经尝试过,但是第二部分返回0行已加载

LOAD DATA
CHaraCTERSET UTF8
TruncATE
INTO TABLE controle 
WHEN (1:4) = 'Ctrl|' 
FIELDS TERMINATED BY "|"
TRAILING NULLCOLS
(   
    Data_type                    CHAR,Id_control                   CHAR,Id_subcontrol                CHAR
    
)
INTO TABLE controle 
WHEN (1:3) = 'Lst'
FIELDS TERMINATED BY "|"
TRAILING NULLCOLS
(   
     Data_type                     CHAR,Id_control                    CHAR,type_list                     CHAR 
)

有什么想法吗? 预先感谢。

解决方法

the docs say

使用多个INTO TABLE子句的关键点是字段 当新的INTO TABLE子句从停止处继续扫描 已处理。本节的其余部分详细介绍了以下重要方法 利用这种行为。它还描述了替代的使用方式 固定字段位置或POSITION参数。

因此,在处理Lst条件时,它将继续在当前行中查找

您可以通过使用position定义第一个字段来将其重置为行的开头来重置此行:

LOAD DATA
INFILE *
TRUNCATE 
INTO TABLE controle 
WHEN Data_type = 'Ctr' 
FIELDS TERMINATED BY "|"
TRAILING NULLCOLS
(   
    Data_type     CHAR,Id_control    CHAR,Id_subcontrol CHAR
    
)
INTO TABLE controle 
WHEN Data_type = 'Lst'
FIELDS TERMINATED BY "|"
TRAILING NULLCOLS
(   
     Data_type   POSITION(1:3) CHAR,Id_control  CHAR,type_list   CHAR 
)
BEGINDATA
Data1|data2|data3
Data4|data5|data6
Ctr|1|2
Lst|1|30
Lst|1|40
Lst|1|50
Data7|data8|data9
Ctr|2|3
Lst|2|60
Lst|2|70