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.