2016-12-28 58 views
0

我正在加載具有日期值的特定字段。然而,它們中的一些不完整的......例如值這個樣子sqlldr - 如何在字段上使用if/then邏輯?

START_DATE 

'2015-06-12' 
'2016-12-24' 
'2015-02'  <--- this is what causes an error 
'2016-01-03' 

我試圖用像這樣一個LENGTH()功能結合NULLIF解決這一點,但是這是不允許的:

開始_ NULLIF LENGTH(:START_DATE)< 10 TO_DATE .....

此返回錯誤

期待正整數或列名,找到關鍵字長度。

我的主要目標是加載正確格式的日期,否則加載NULL。在ctl文件中最簡單的方法是什麼?我可以避免創建自定義功能嗎?

回答

1

說我有這樣的一個表:

create table dateTable(START_DATE date) 

,我需要加載該文件,在這裏我想插NULL在字符串不匹配我的模式

'2016-12-28' 
'2016-12-' 
'2016-12-31' 

我可以在我的ctl文件中添加一些邏輯以檢查字符串的長度以這種方式加載:

load data 
infile dateTable.csv 
into TABLE dateTable 
fields enclosed by "'" 
(START_DATE "to_date(case when length(:START_DATE) = 10 then :START_DATE end, 'yyyy-mm-dd')" 
) 

這只是檢查字符串的長度,但你可以編輯它,你需要建立自己的邏輯;注意CASE在沒有條件匹配時會給出NULL,所以這相當於case when length(:START_DATE) = 10 then :START_DATE else NULL end

這給出了以下結果:

SQL> select * from dateTable; 

START_DATE 
---------- 
28-DEC-16 

31-DEC-16 
0

在oracle中,您可以驗證字符串以確保它是有效的日期或不是。請檢查IsDate功能。

+0

我應該更具體,我說的只是CTL文件中工作。 – Yoav24