2016-03-02 91 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很高興它爲你工作。關於你的第一條評論,兩者都可以工作,但如果需要改變,將會造成混亂和長期維護。通過這種方式,非編碼器可以更新表中的查找值,例如,如果它們發生變化。 –