sqlldr - как использовать if/then логику на поле?

Я загружаю определенное поле со значениями даты. Однако некоторые из них не являются полными... например, значения выглядят так

START_DATE  

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

Я пытался решить это путем объединения NULLIF с LENGTH() функция так, но это не разрешено:

Start_date NULLIF LENGTH (: start_date)<10 to_date.....

это возвращает ошибку

Ожидается положительное целое число или имя столбца, найденная длина ключевого слова.

Моя главная цель - загрузить даты в правильном формате и в противном случае загрузить NULL. Какой самый простой способ сделать это в файле ctl? Можно ли избежать создания пользовательской функции?

2 ответа

Решение

Скажем, у меня есть такая таблица:

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

В oracle вы можете проверить строку, чтобы убедиться, что это правильная дата или нет. Пожалуйста, проверьте функцию IsDate.

Другие вопросы по тегам