sql - 使用 TO_NUMBER 以固定记数法和科学记数法解析数字

标签 sql oracle oracle12c number-formatting string-parsing

使用 Oracle SQL,当字符串(VARCHAR2 列)可以包含以下任一内容时,如何将字符串转换为数字:

  • 固定符号的数字,例如 -11.496606820938826
    SELECT TO_NUMBER('-11.496606820938826', '999.999999999999999999', 'NLS_NUMERIC_CHARACTERS=''. ''') FROM DUAL;
    
  • 以科学记数法表示的数字,例如 -4.0504035245989348E-3
    SELECT TO_NUMBER('-4.0504035245989348E-3', '999.999999999999999999EEEE', 'NLS_NUMERIC_CHARACTERS=''. ''') FROM DUAL;
    

  • 到目前为止,我已经使用了以下 format models :
  • 固定符号:999.999999999999999999
  • 科学记数法:999.999999999999999999EEEE

  • 但我找不到适用于两种情况的单一格式模型。

    示例数据:
     STRING_VALUE
    ------------------------
     -4.0504035245989348E-3 
     -11.496606820938826    
    ------------------------
    

    我使用的是 Oracle 12.1,所以我不能使用 VALIDATE_CONVERSION也不是 ON CONVERSION ERROR .

    编辑

    此外,此代码将在具有不同 NLS 设置的不同环境中运行;我不能假设使用 TO_NUMBER 没有格式模型就可以工作。

    最佳答案

    使用 CASE 怎么样?陈述?

    CREATE TABLE t (v VARCHAR2(30));
    INSERT INTO t VALUES ('-11.49660682093882');
    INSERT INTO t VALUES ('-4.0504035245989348E-3');
    
    SELECT v, CASE WHEN v LIKE '%E%' 
               THEN TO_NUMBER(v, '999.999999999999999999EEEE', 'NLS_NUMERIC_CHARACTERS=''. ''')
               ELSE TO_NUMBER(v, '999.999999999999999999',     'NLS_NUMERIC_CHARACTERS=''. ''') 
              END AS x
      FROM t;
    
    V                        X
    -11.49660682093882       -11,49660682093882
    -4.0504035245989348E-3   -0,0040504035245989348
    

    关于sql - 使用 TO_NUMBER 以固定记数法和科学记数法解析数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61504783/

    相关文章:

    Oracle 无法将数据插入 varchar2(4000 char) 列

    sql - 在 Rails AR 中增加字段值的安全方法

    sql - 选择跨案例的不同计数

    sql - 两列性能问题的左外连接

    sql - 在 Select 语句中声明和设置变量

    sql - Oracle 12c - CLOB 字段中的西里尔字符

    sql - Postgres Inner Join Select 查询返回错误 : column does not exist

    sql - 使用 Oracle 数据创建 SSAS 多维数据集是否必须使用 SSIS?

    database - 刷新复杂的物化 View

    sql - Oracle TO_DATE 不抛出错误