如何在sql-loader中使用to_number和nullif?

时间:2013-08-09 09:45:55

标签: oracle sql-loader

我在日期(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

我如何结合这些?

1 个答案:

答案 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字符?这是将,视为小数点分隔符,而你的问题表明你正在使用.。任何一个都可以工作,只要值当然用双引号括起来。