2016-03-02 55 views
1

我从一个CSV文件中使用SQLLDR加载数据到表替换与另一列的子一列的数据。有一列不存在于csv文件的每一行中。填充此列所需的数据存在于该行的其他列之一中。我需要拆分(分割(。))该列的数据并填充到该列中。在SQL装载机

,如: -

column1:- abc.xyz.n 

所以未知列(列2)应

column2:- xyz 

此外,还有另一个列这是目前该行中,但它不是我想要的输入进入桌子。它也需要从column1填充。但是,那里约有50个if-else案例。解码是否可以这样做?

column1:- abc.xyz.n 

然后,

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

这样每年大约有50如果其他案件。

感谢您的帮助。

回答

2

对于你的问题的第一部分,定义在控制文件BOUNDFILLER与不匹配表的列名,它告诉SQLLDR记住它,但不使用它的名字列1数据。如果您需要将其加载到列中,请使用列名称和记住的名称。对于列2中,在返回您需要的部分表达式中使用的记忆BOUNDFILLER名称(在这种情况下,第2场,允许空值):

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

注意需要双反斜线否则它就会为它删除从sqlldr传递给正则表达式引擎,正则表达式模式被错误地修改。我想是一个怪癖。

反正这COLUMN1与 “abc.xyz.n” 和COLUMN2结束后获得 “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返回查找查找表“某某”,即“你好”按你的例子​​的结果。

+0

我会努力实现并取回。我正在考虑为第二部分使用case语句,并为第一部分使用SUBSTR(:column1,INSTR(:column1,'。'),INSTR(:column1,'。', - 1))。这些也会起作用吗? – Jaydeep

+0

我已经尝试过你的方法,效果很好,使用第二部分的功能使工作更快。谢谢 – Jaydeep

+0

@jaydeep很高兴它为你工作。关于你的第一条评论,两者都可以工作,但如果需要改变,将会造成混乱和长期维护。通过这种方式,非编码器可以更新表中的查找值,例如,如果它们发生变化。 –