【问题标题】:Oracle nvl need to insert null into a number fieldOracle nvl 需要在数字字段中插入 null
【发布时间】:2015-10-27 01:05:49
【问题描述】:

这是我正在运行的删除脚本的后备脚本。这是我用来生成插入语句的查询。

select 'insert into remark_element(ELEMENTID, 
                                   REMARKID, 
                                   VALUE, 
                                   POSITION, 
                                   INFO_TYPE, 
                                   SCRIPTID)
                           values('||elementid||',
                                  '||remarkid||',
                                '''||nvl(value,'null')||''',
                                  '||position||',
                                  '||nvl(info_type,null)||',
                                  '||nvl(scriptid,null)||''||')' 
                          from remark_element 
                          where elementid in(....

这是该查询的结果:

insert into remark_element(ELEMENTID,
                           REMARKID, 
                           VALUE, 
                           POSITION, 
                           INFO_TYPE, 
                           SCRIPTID)     
                    values(29650520,
                           20263860,
                          '0/877-426-6251-A',
                           1,,);

运行它会给出 ORA-00936: 由于空的 info_type 和 scriptid 字段而缺少表达式,这两个字段都是数字并且允许为空。我需要生成的查询说

insert into remark_element(ELEMENTID, 
                           REMARKID, 
                           VALUE, 
                           POSITION, 
                           INFO_TYPE, 
                           SCRIPTID) 
                    values(29650520,
                           20263860,
                          '0/877-426-6251-A',
                           1,
                           null,
                           null);

当 info_type 和 scriptid 为空时。我试过做 nvl(info_type,'null') 但得到 ORA-01722: invalid number for trying to put a string into a number field。当 info_type 或 scriptid 为 null 时,我如何操纵它以返回 null 而不是 ,

【问题讨论】:

  • 你为什么用javamysql标记你的问题?

标签: java mysql oracle nvl


【解决方案1】:

由于您的输出最终是一个字符串,因此只需使用 to_char 将您的列转换为字符串,让两个 nvl 参数都是一个字符串:

nvl(to_char(info_type), 'null')

【讨论】:

    【解决方案2】:

    @sstan 的答案的替代方法是使用decode 函数,它在混合不同数据类型时不如NVLcoalesce 敏感:

    decode(info_type, null, 'null', info_type)
    

    上述语句检查info_type的值,如果值为null,则返回'null';否则返回被检查的值本身。

    【讨论】:

      【解决方案3】:

      您正在生成代码。我更喜欢使用coalesce(),因为它是ANSI 标准。第二个参数应该是字符串'null',而不是常量null

      select 'insert into remark_element(ELEMENTID, REMARKID, VALUE, POSITION, INFO_TYPE, SCRIPTID) values('||elementid || ',' || remarkid || ',''' || nvl(value,'null') || ''',' ||position||',' ||
      coalesce(cast(info_type as varchar2(255)), 'null') || ',' || coalesce(cast(scriptid as varchar2(255)), 'null') || ''||')'
      from remark_element where elementid in(....
      

      【讨论】:

      • coalesce 返回列表中的第一个非空表达式,因此我们仍然遇到当 oracle 需要一个数字时返回字符串的问题。我运行了您的查询,但仍然遇到相同的错误
      • 略有不同的错误 ORA-00932:不一致的数据类型:预期 NUMBER 得到 CHAR
      • @Gordon,NVLcoalesce 都对数据类型有严格要求;您不能像这样将 NUMBER 列与 CHAR 文字(不能隐式转换为 NUMBER)进行比较。
      【解决方案4】:

      试试这个,为我工作:

      select 'insert into remark_element(ELEMENTID, REMARKID, VALUE, POSITION, INFO_TYPE, SCRIPTID) values('||elementid||','||remarkid||','''||nvl(value,'null')||''','||position||','||
      nvl(info_type,'null')||','||nvl(scriptid,'null')||''||')' from remark_element where elementid = 29650520
      

      当你在执行查询时,Oracle 发现 null 结果什么都没有,但是如果使用 'null',它会被认为是一个字符串。

      所以,用引号将(info_type,null) 替换为(info_type,'null')

      【讨论】:

        【解决方案5】:

        您的查询必须是这样的:

        select 'insert into remark_element(ELEMENTID, 
                                       REMARKID, 
                                       VALUE, 
                                       POSITION, 
                                       INFO_TYPE, 
                                       SCRIPTID)
                               values('||elementid||',
                                      '||remarkid||',
                                      '||nvl2(value,''''||value||'''','null')||',
                                      '||position||',
                                      '||nvl2(info_type,to_char(info_type), 'null')||',
                                      '||nvl2(scriptid,to_char(scriptid), 'null')||')' 
                              from remark_element 
                              where elementid in(....
        

        【讨论】:

        • 这将因ORA-01722: invalid number 而失败,因为NVL2 的第二个和第三个输入参数具有不同的数据类型。您需要使用decode 或将列包装在to_char() (nvl2(info_type, to_char(info_type), 'null')) 中。
        猜你喜欢
        • 1970-01-01
        • 2018-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多