【问题标题】:How to use to_number and nullif in sql-loader?如何在 sql-loader 中使用 to_number 和 nullif?
【发布时间】:2013-08-09 09:45:54
【问题描述】:

我在这里遇到了类似的日期问题(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

我该如何组合这些?

【问题讨论】:

    标签: oracle sql-loader


    【解决方案1】:

    您的NULLIF 条件不应位于 SQL 字符串的双引号内;它需要首先出现。来自the documentation

    • SQL 字符串出现在给定列的任何其他规范之后。

    • SQL 字符串必须用双引号引起来。

    ...

    • 在任何 NULLIF 或 DEFAULTIF 子句之后,但在日期掩码之前评估 SQL 字符串。

    应该是这样的:

    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 字符是否正确?这会将 , 视为小数分隔符,而您的问题表明您使用的是 .。只要将值包含在 double 中,两者都可以使用- 引号,当然)。

    【讨论】:

    • 它有效!谢谢。对于 NLS,您似乎也是对的。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 2021-04-18
    • 2019-02-28
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多