语句SQL

时间:2018-11-16 09:03:47

标签: sql oracle data-warehouse oracle-data-integrator

我在执行Datawarehouse转换任务时遇到一些困难,我有一些以varchar格式输入的源列,其中包含的数据为:空白,-,十进制数字(例如(1234.44))。

target中的那些列被声明为number。

我正在尝试使用此代码处理该数据,但我一直收到无效的数字错误:

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

在第一个when语句中,我试图检查-在源代码中,找到后返回null,如果找到它,则将其放置为null(本质上将破折号替换为null)

第二秒,当我试图处理这些空格时,我认为它们可能会导致错误

最后在else语句中,我想将其从varchar解析为要加载到目标表中的数字。

如果有人有某种建议,请帮忙!

谢谢

1 个答案:

答案 0 :(得分:0)

尝试

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

INSTR返回字符串中字符的第一个位置。因此,如果没有破折号,它将返回0。大于0的值表示字符串中至少有一个破折号。

以下是您的代码中的一些错误:

  • 满足条件时语句将退出的情况。因此,您可以在第一个条件下删除破折号,并期望它在下一个条件下继续处理您的字符串。在您的代码中,如果字符串带有破折号,则结果将为null。
  • LENGTH函数返回字符串中的字符数。仅当字符串为null时,它将返回null值。因此,直接编写column78input IS NULL
  • 更容易
  • 您当前的第一个条件基本上是这样的:“ 将破折号替换为空格并删除所有前导/尾随空格后,如果字符串为null,则”。因为您要替换字符串中的破折号,所以无法检查是否存在。