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 之后,如果字符串是然后为空”。因为您正在替换字符串中的破折号,所以您无法检查是否出现。
我在数据仓库转换任务中遇到了一些困难,我有一些源列以 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 之后,如果字符串是然后为空”。因为您正在替换字符串中的破折号,所以您无法检查是否出现。