这是我正在运行的删除脚本的后备脚本。这是我用来生成插入语句的查询。
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而不是
答案 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
函数,该函数在混合不同数据类型时不如NVL
或coalesce
敏感:< / 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(....