case when 语句 SQL

Case when statement SQL

我在数据仓库转换任务中遇到了一些困难,我有一些源列以 varchar 格式出现,包含的数据:空白、-、十进制数字,例如 (1234.44)。

目标中的那些列被声明为数字。

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

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

在第一个 when 语句中,我试图检查是否存在 - 在源代码中,它 returns 找到时为 null,如果找到它,则将其放置为 null(实质上用 null 替换破折号)

在我试图处理那些空白的第二个 when 语句中,我认为它们可能会导致错误

最后在 else 语句中,我想将它从 varchar 解析为 number 以加载到目标 table。

如果有人有什么建议,请帮忙!

谢谢

试试

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

INSTR returns 字符在字符串中的第一个位置。因此,如果没有破折号,则 return 0。大于 0 的值表示字符串中至少有一个破折号。

您的代码中存在一些错误:

  • 条件满足时case when语句退出。因此,您可以在第一个条件下删除破折号,并期望它在下一个条件下继续处理您的字符串。在您的代码中,如果字符串有破折号,则结果将为空。
  • LENGTH 函数returns 字符串中的字符数。仅当字符串为空时,它才会 return 一个空值。所以直接写成column78input IS NULL
  • 比较简单
  • 您当前的第一个条件基本上是这样的:“用 space 替换破折号并删除所有 leading/trailing space 之后,如果字符串是然后为空”。因为您正在替换字符串中的破折号,所以您无法检查是否出现。