解析描述字符串以填充NULL字段

Fra*_* R. 5 informix parsing ssis etl

Informix 12.10

tblItems
(
Type        SMALLINT,       {Precious Metal = 1, Other = 2}
Description VARCHAR,
Quantity    SMALLINT,
Name        VARCHAR,
Weight      DECIMAL(5,1),
Purity      SMALLINT,
Brand       VARCHAR,
Model       VARCHAR,
SerialNum   VARCHAR
);
Run Code Online (Sandbox Code Playgroud)

编辑更新:以下示例数据存储在tblItems.Type和tblItems.Description中.请注意,Description列中的内容都是大写字符,也可能包含标点字符.

2|1LAPTOP APPLE 15.5" MODEL MACKBOOK PRO,S/N W80461WCAGX, WITH CHARGER||||||||
1|1RING 2.3PW 14K||||||||
2|DRILL RIOBY, MODEL D5521 S/N77720||||||||
2|TRIMMER TORO, MODEL 0242 S/N 66759||||||||
2|CELL SAMSUNG NOTE3, MODEL SM-N900T S/N RV8F90YLZ9W||||||||
Run Code Online (Sandbox Code Playgroud)

我需要使用注释中提到的规则将示例项描述解析为下面的列:

Quantity,      {if description string does not start with a number, then Quantity = 1}
Name,          {Always the first element if description has no quantity, second element if quantity present] 
Weight,        {Always before "PW" if Type = 1, Default to zero if Type = 2}
Purity,        {Always before "K" if Type = 1, Default to NULL if Type = 2} 
Brand,         {Always the second element in description, if present} 
Model,         {Always after "MODEL", with or without a space}
Serial Number  {Always after "S/N", with or without a space}
Run Code Online (Sandbox Code Playgroud)

我想用UPDATE语句来做这件事,但如果Informix有一个像SQL-Server的SSIS这样的导入实用工具,那么这可能是一个更好的选择.

更新,预期结果:

Quantity   1               1       1        1         1
Name       LAPTOP          RING    DRILL    TRIMMER   CELL
Weight     0.0             2.3     0.0      0.0       0.0
Purity                     14
Brand      APPLE                   RIOBY    TORO      SAMSUNG
Model      MACKBOOK PRO            D5521    0242      SM-N900T
SerialNum  W8046WCAGX              77720    66759     RV8F90YLZ9W
Run Code Online (Sandbox Code Playgroud)

Luí*_*ues 2

假设您使用的是 Informix 12.10.XC8 或更高版本,您可以尝试使用正则表达式来解析描述字符串(请参阅此处的在线文档)。

例如,对于序列号,您可以执行以下操作:

UPDATE tblitems
SET
serialnum = 
DECODE 
(
    regex_match(description, '(.*)(S\/N)(.*)', 3)
    , 't'::BOOLEAN, regex_replace(description, '(.*)(S\/N)([[:blank:]]?)([[:alnum:]]*)(.*)', '\4', 0, 3)
    , 'f'::BOOLEAN, ''
)
Run Code Online (Sandbox Code Playgroud)

因此,在前面的示例中,我正在测试描述是否包含字符串S/N,如果是这样,我将使用regex_replace它返回后面的值,在本例中是正则表达式中的第四个匹配组(我不使用regex_extract它来获取值,因为它似乎返回多个值,我收到错误-686)。

您可以将此方法扩展到其余列,并查看正则表达式是否足以解析描述列。