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 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 而不是 ,

4

5 回答 5

2

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

nvl(to_char(info_type), 'null')
于 2015-10-27T01:26:41.820 回答
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(....
于 2015-10-27T01:10:08.427 回答
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(....
于 2015-10-27T07:26:34.833 回答
0

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

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

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

于 2015-10-27T02:01:11.470 回答
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时,结果什么都没有,但如果使用 'null',它将被视为一个字符串。

因此,用引号替换(info_type,null)for 。(info_type,'null')

于 2015-10-27T02:13:30.940 回答