在 sql 加载程序中用另一列的子字符串替换一列的数据

Replace data of one column with substring of another column in sql loader

我正在使用 sqlldr 将数据从 csv 文件加载到 table。 csv 文件的每一行中都没有一列。填充此列所需的数据存在于该行的其他列之一中。我需要拆分 (split(.) ) 该列的数据并填充到该列中。

赞:-

 column1:- abc.xyz.n  

所以未知列(column2)应该是

 column2:- xyz

此外,该行中还有另一列,但这不是我想要输入到 table 中的内容。还需要从 column1 填充它。但是其中大约有 50 个 if-else 案例。解码更适合这样做吗?

column1:- abc.xyz.n

然后,

column2:- hi if(column1 has 'abc')
             if(column1 has 'abd' then 'hello')

像这样大约有 50 个 if-else 案例。

感谢您的帮助。

对于问题的第一部分,将控制文件中的 column1 数据定义为 BOUNDFILLER,其名称与 table 列名称不匹配,这会告诉 sqlldr 记住它但不要使用它.如果需要将其加载到列中,请使用列名加上记住的名称。对于 column2,在表达式中使用记住的 BOUNDFILLER 名称,其中 return 是您需要的部分(在本例中为第二个字段,允许 NULL):

  x        boundfiller,
  column1  EXPRESSION  ":x",
  column2  EXPRESSION  "REGEXP_SUBSTR(:x, '(.*?)(\.|$)', 1, 2, NULL, 1)"

请注意双反斜杠是必需的,否则它会在从 sqlldr 传递到正则表达式引擎时被删除,并且正则表达式模式被错误地更改。我猜是个怪癖。

无论如何,在此 column1 以 "abc.xyz.n" 结束并且 column2 获得 "xyz".

之后

对于问题的第二部分,您可以使用已经显示的表达式,但调用您创建的自定义函数,在其中传递提取的值,它将 return 从查找中搜索到的值 table。您当然不想对 50 个查找值进行硬编码。您基本上也可以在 table 级别触发器中执行相同的操作。请注意,我只显示了一个 select 语句作为示例,但为了可重用性和可维护性,应该将其封装在一个函数中:

只是为了证明你能做到:

 col2  EXPRESSION  "(select 'hello' from dual where REGEXP_SUBSTR(:x, '(.*?)(\.|$)', 1, 2, NULL, 1) = 'xyz')"

正确的方法:

 col2  EXPRESSION  "(myschema.mylookupfunc(REGEXP_SUBSTR(:x, '(.*?)(\.|$)', 1, 2, NULL, 1)))"

mylookupfunc returns 在查找 table 中查找 'xyz' 的结果,即根据您的示例 'hello'。