Oracle 在sql loader中将一列的数据替换为另一列的子字符串

Oracle 在sql loader中将一列的数据替换为另一列的子字符串,oracle,csv,sql-loader,Oracle,Csv,Sql Loader,我正在使用sqlldr将csv文件中的数据加载到表中。csv文件的每一行中都有一列不存在。填充此列所需的数据显示在行的另一列中。我需要拆分该列的数据并填充到该列中 比如:- column1:- abc.xyz.n 所以未知列(第2列)应该是 column2:- xyz 此外,行中还有另一列,但它不是我要输入到表中的内容。它还需要从第1列填充。但如果不是这样的话,大约有50例。解码比这更好吗 column1:- abc.xyz.n 那么 column2:- hi if(column1

我正在使用sqlldr将csv文件中的数据加载到表中。csv文件的每一行中都有一列不存在。填充此列所需的数据显示在行的另一列中。我需要拆分该列的数据并填充到该列中

比如:-

 column1:- abc.xyz.n  
所以未知列(第2列)应该是

 column2:- xyz
此外,行中还有另一列,但它不是我要输入到表中的内容。它还需要从第1列填充。但如果不是这样的话,大约有50例。解码比这更好吗

column1:- abc.xyz.n
那么

column2:- hi if(column1 has 'abc')
             if(column1 has 'abd' then 'hello')
像这样的话,大约有50个病例


谢谢您的帮助。

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

注意,需要使用双反斜杠,否则当它从sqlldr传递到正则表达式引擎时会被删除,并且正则表达式模式被错误地更改。我想这是个怪癖

无论如何,在这之后,第1列以“abc.xyz.n”结尾,第2列以“xyz”结尾

对于问题的第二部分,您可以使用已经显示的表达式,但调用您创建的自定义函数,在其中传递提取的值,它将从查找表返回搜索的值。您当然不想硬编码50个查找值。您也可以在表级触发器中执行基本相同的操作。注:我仅为示例显示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返回在查找表中查找“xyz”的结果,即根据您的示例返回“hello”

我会努力实施,然后回来。我在考虑对第二部分使用case语句,对第一部分使用SUBSTR(:column1,INSTR(:column1,“.”),INSTR(:column1,“.”,-1))。这些也可以吗?我试过你的方法,效果很好,在第二部分使用函数使工作更快。Thanks@jaydeep很高兴它对你有用。关于您的第一条评论,这两种方法都可以,但都会让人困惑,如果需要更改,从长远来看需要更多的维护。例如,如果表中的查找值发生更改,非编码人员可以通过这种方式更新它们。如果我的一列是a#b#c#d,您可以帮助使用表达式将其拆分为四列,即a、b、c和d吗above@Jaydeep基本上和上面一样,只需将分隔符从句号改为磅号,REGEXP_SUBSTR()的第四个参数将针对您想要的每个字段进行更改。为每个字段调用它。
 col2  EXPRESSION  "(myschema.mylookupfunc(REGEXP_SUBSTR(:x, '(.*?)(\\.|$)', 1, 2, NULL, 1)))"