Oracle nvl需要在数字字段

时间:2015-10-27 01:05:49

标签: java mysql oracle nvl

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

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为null时。我试过做nvl(info_type,' null')但得到ORA-01722:尝试将字符串放入数字字段的无效数字。当info_type或scriptid为null时,我如何操纵它返回null而不是

5 个答案:

答案 0 :(得分:1)

由于您的输出最终是一个字符串,因此只需将# -*- coding: utf-8 -*- 个参数都设为字符串,方法是使用nvl将列转换为字符串:

to_char

答案 1 :(得分:0)

您正在生成代码。我更喜欢使用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(....

答案 2 :(得分:0)

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

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

上述声明检查info_type的值,如果值为'null',则返回null;否则将返回被检查的值。

答案 3 :(得分:0)

试试这个,为我工作:

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 时,结果不算什么,但是如果使用&#39; null&#39;,它将被视为字符串。

因此,请使用引号替换(info_type,null) (info_type,'null')

答案 4 :(得分:0)

您的查询必须如下:

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(....