2016-03-02 4 views
1

Я загружаю данные из файла csv в таблицу с использованием sqlldr. Существует один столбец, который отсутствует в каждой строке файла csv. Данные, необходимые для заполнения этого столбца, присутствуют в одном из других столбцов строки. Мне нужно разделить (разделить (.)) Данные этого столбца и заполнить этот столбец.Заменить данные одного столбца подстрокой другого столбца в загрузчике sql

как: -

column1:- abc.xyz.n 

Так неизвестный столбец (column2) должен быть

column2:- xyz 

Кроме того, есть еще один столбец, который присутствует в строке, но это не то, что я хочу, чтобы ввести в таблицу. Это также необходимо заполнить из столбца 1. Но в этом случае есть около 50 случаев if-else. Желательно ли декодировать это?

column1:- abc.xyz.n 

Затем

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

, как это существует около 50, если-то в других случаях.

Спасибо за помощь.

ответ

2

Для первой части вашего вопроса определите данные столбца в управляющем файле как BOUNDFILLER с именем, которое не соответствует имени столбца таблицы, которое сообщает sqlldr запомнить его, но не использует его. Если вам нужно загрузить его в столбец, используйте имя столбца плюс запоминающееся имя. Для COLUMN2, используйте запомненное имя BOUNDFILLER в выражении, где она возвращает часть, которую нужно (в данном случае 2-ое поле, что позволяет значения NULL):

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

Примечание двойной обратный слеш нужен еще он получает удалены как это передается в regex engine из sqlldr, а шаблон регулярного выражения изменяется неправильно. Думаю, причуда.

В любом случае после этого столбца 1 заканчивается «abc.xyz.n», а column2 получает «xyz».

Для второй части вашего вопроса вы можете использовать выражение, как уже показано, но вызвать пользовательскую функцию, которую вы создаете, где вы передаете извлеченное значение, и оно вернет искомое значение из таблицы поиска. Вы, конечно, не хотите жестко задавать 50 значений поиска. Вы можете сделать то же самое и в триггерах уровня таблицы. Обратите внимание, я показываю отборное заявление только для примера, но это должно быть воплощен в функции для повторного использования и ремонтопригодность:

Просто, чтобы показать, что вы можете сделать это:

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 возвращает результат поиска «xyz» в таблице поиска, то есть «привет» в соответствии с вашим примером.

+0

Я постараюсь реализовать и вернуться. Я думал об использовании операторов case для второй части и использовал SUBSTR (: column1, INSTR (: column1, '.'), INSTR (: column1, '.', - 1)) для первой части. Будут ли они работать тоже? – Jaydeep

+0

Я пробовал ваш метод, отлично работает, и использование функции для второй части ускорило работу. Спасибо – Jaydeep

+0

@jaydeep рад, что это сработало для вас. Что касается вашего первого комментария, то оба могут работать, но будут путать и больше обслуживания в долгосрочной перспективе, если изменения потребуются.Таким образом, не-кодер может обновлять значения поиска в таблице, если они будут изменены, например. –

Смежные вопросы