mysql Oracle nvl需要在数字字段中插入空值

jutyujz0  于 2023-02-07  发布在  Mysql
关注(0)|答案(6)|浏览(167)

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

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);

当信息类型和脚本ID为空时。我已尝试执行nvl(信息类型,“空”),但获得ORA-01722:无效的数字为尝试到放一个字符串到一个数字字段.我怎样能操纵这到返回作为null代替,,当这info_type或scriptid是null

owfi6suc

owfi6suc1#

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

nvl(to_char(info_type), 'null')
t3irkdon

t3irkdon2#

@sstan的答案的另一种选择是使用decode函数,在混合不同的数据类型时,该函数不像NVLcoalesce那样敏感:

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

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

cl25kdpy

cl25kdpy3#

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

4ioopgfo4#

试试这个,为我工作:

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 findnull时,结果为空,但如果使用'null',则将其视为字符串。
因此,用引号将(info_type,'null')替换为(info_type,null)

disho6za

disho6za5#

您的查询必须如下所示:

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

lkaoscv76#

开始插入WEBSITES_STATUS(STATUS,HTTP_CODE)值('DOWN',(nvl('$b','无法识别错误。请通过浏览器手动检查。')));承诺;结束;/

相关问题