3

我在这里遇到了类似的日期问题(to_date 和 nullif 的组合):如何在 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

我怎样才能结合这些?

4

1 回答 1

3

您的NULLIF条件不应在 SQL 字符串的双引号内;它需要首先出现。从文档中

  • 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 字符是否正确?这被,视为小数分隔符,而您的问题表明您正在使用.。当然,只要将值括在双引号中,任何一个都可以工作)。

于 2013-08-09T10:12:49.093 回答