【问题标题】:oracle does not give error inspite of the wrong format string in to_number function?尽管 to_number 函数中的格式字符串错误,oracle 不会给出错误?
【发布时间】:2016-04-14 17:54:30
【问题描述】:

在oracle sql中,

TO_NUMBER('1,000.98', '9,999.99') 给出的答案为1000.98。 //第 1 行

TO_NUMBER('1,000.98', '9999.99') 也给出了1000.98 的答案。 //line2

尽管格式字符串与给定字符串不匹配,为什么 line2 不给出错误?(格式字符串没有逗号)

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    Oracle 文档在我的国家/地区被禁止,因此我无权访问它。
    但是在非官方教程中很明显,如果您使用 TO_NUMBER 函数而不使用第三个参数(NLS_Params),它将忽略所有非数字字符并显示数字并仅识别点( .) 作为小数点的表示法。
    如果您希望它识别数字中使用的所有其他可能的格式字符(例如 , 表示千位分隔符),您也必须使用第三个参数。
    正确的形式是:

    TO_NUMBER('1,000.98', '9999.99', 'nls_numeric_characters=''.,''')
    

    有好的答案的类似问题在这里:

    StackOverFlow

    希望对你有帮助。

    【讨论】:

    • 但是如果我不提到格式字符串,它如何能够识别逗号并给出错误?例如,如果我写 TO_NUMBER('1,000.98') 会出错。
    • 另外,如果我在格式字符串的其他位置给出逗号,例如TO_NUMBER('1,000.98','999,9.99') 它给出了错误。只有当我不给任何逗号时,它才能正常工作。
    • 即使在编写了第三个参数之后,它的工作方式也一样
    • @A_J 检查这个问题,如果有帮助,请告诉我。我认为选定的答案将解决问题。 [stackoverflow.com/questions/24571355/…
    • 我从链接中了解到:逗号是默认的 NLS_NUMERIC_CHARACTER,这就是为什么即使在格式字符串中没有提及它也能正常工作的原因。但我不确定我是否理解正确。如果您能解释一下,那将非常有帮助。
    【解决方案2】:

    TO_NUMBER 文档有点令人困惑

    TO_NUMBER 将 expr 转换为 NUMBER 数据类型的值。 expr 可以是 BINARY_DOUBLE 值或 CHAR、VARCHAR2、NCHAR 或 NVARCHAR2 数据类型的值包含可选格式模型 fmt 指定格式的数字

    尽管如此Oracle只关心在进行转换时来自源字符串的小数分隔符所以它忽略了数千组标记,依此类推。 这种行为似乎没有记录在任何地方

    分隔符标记由NLS_NUMERIC_CHARACTERS设置。

    NLS_NUMERIC_CHARACTERS 选项指定十进制标记和 会话的千组标记。

    对于最安全的转换,请考虑CAST

    SQL> SELECT CAST('1000,98' as DECIMAL(10,2)) as TO_NUMBER FROM DUAL;
    
     TO_NUMBER
    ----------
       1000,98
    

    【讨论】:

    • 默认格式是什么?我问因为 TO_NUMBER('1,0,0,0,00.98', '999999.99') 也在工作。尽管给出了这么多逗号并且格式字符串没有逗号,但它仍然接受该值,您能解释一下原因吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2018-09-21
    • 2018-10-05
    相关资源
    最近更新 更多