我在日期(to_date和nullif的组合)遇到了类似的问题:How to use decode in sql-loader?
它很好地解决了。
我的问题是我的CSV文件中的数字字段可以包含以下格式:999,999,999.99或只是一个点'。'对于空值。
这是正常工作:
MINQUANTITY "TO_NUMBER(:MINQUANTITY, '9999999999D999999', 'NLS_NUMERIC_CHARACTERS='',.''')"
或
MINQUANTITY NULLIF MINQUANTITY = '.'
但是当我尝试将两者结合起来时,无法正常工作:
MINQUANTITY "TO_NUMBER(:MINQUANTITY, '9999999999D999999', 'NLS_NUMERIC_CHARACTERS='',.''') NULLIF :MINQUANTITY= '.'"
以下是错误日志:
Record 1: Rejected - Error on table MY_TABLE, column MINQUANTITY.
ORA-00917: missing comma
我如何结合这些?
答案 0 :(得分:2)
您的NULLIF
条件不应位于SQL字符串的双引号内;它需要先来。来自the documentation:
SQL字符串出现在给定列的任何其他规范之后。
SQL字符串必须用双引号括起来。
...
- SQL字符串在任何NULLIF或DEFAULTIF子句之后但在日期掩码之前计算。
所以它应该是:
MINQUANTITY NULLIF MINQUANTITY = '.'
"TO_NUMBER(:MINQUANTITY, '9999999999D999999', 'NLS_NUMERIC_CHARACTERS='',.''')"
(为了便于阅读,您可以分成两行,这两个部分仍然适用于`MINQUANTITY字段)。
在报告为:
的日志中MINQUANTITY NEXT * , CHARACTER
NULL if MINQUANTITY = 0X2e(character '.')
SQL string for column : "TO_NUMBER(:MINQUANTITY, '9999999999D999999', 'NLS_NUMERIC_CHARACTERS='',.''')"
(你有没有正确的NLS字符?这是将,
视为小数点分隔符,而你的问题表明你正在使用.
。任何一个都可以工作,只要值当然用双引号括起来。