Случай, когда оператор SQL - PullRequest
0 голосов
/ 16 ноября 2018

Я сталкиваюсь с некоторыми трудностями при выполнении задачи преобразования Datawarehouse, у меня есть несколько исходных столбцов, которые идут в формате varchar, данные содержат: пробелы, -, десятичные числа, такие как (1234.44).

Эти столбцы вцель объявляется как число.

Я пытаюсь обработать эти данные этим кодом, но получаю сообщение об ошибке неверного номера:

 CASE WHEN
        LENGTH(TRIM(TRANSLATE(column78input, '-', ' '))) is null then null 
    WHEN column78input IS NULL THEN 0
     else to_number(column78input)
END

Во-первых, когда утверждение я пытаюсь проверить, есть ли - в источнике, оновозвращает null, когда найден, и если вы найдете его, поместите его как ноль (заменяя тире по существу нулями)

Через секунду, когда в операторах я пытаюсь обработать эти пробелы, я подумал, что они могут вызвать ошибку

И, наконец, в операторе else я хочу разобрать его с varchar на число для загрузки в целевую таблицу.

Если у кого-то есть какие-то предложения, пожалуйста, помогите!

Спасибо

1 Ответ

0 голосов
/ 16 ноября 2018

Попробуйте с

CASE
    WHEN INSTR(column78input, '-') > 0 OR column78input IS NULL THEN 0
    ELSE TO_NUMBER(REPLACE(column78input, ' '))
END

INSTR возвращает первую позицию символа в строке. Таким образом, если тире нет, он возвращает 0. Значение больше 0 означает, что в строке есть хотя бы один тире.

Вот несколько ошибок в вашем коде:

  • Случай, когда оператор завершится, когда условие будет выполнено. Таким образом, вы можете удалить черту в первом условии и ожидать, что она продолжит обработку вашей строки в следующем условии. В вашем коде, если строка имеет тире, результат будет нулевым.
  • Функция LENGTH возвращает количество символов в строке. Он вернет нулевое значение, только если строка пуста. Так что проще написать column78input IS NULL
  • Ваше первое первое условие в основном таково: " После замены дефиса пробелом и удаления всех начальных / конечных пробелов, если строка равна нулю, тогда ". Поскольку вы заменяете тире в строке, вы не можете проверить, есть ли вхождение или нет.
...