oracle if 0,如果为null(nvl)

kra*_*626 6 oracle

如果为null,oracle有一个很好的内置函数,但是我想做= 0; 有一个简单的方法来做到这一点?

nvl(instr(substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,'bldg')+ 5),''),length(substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,'bldg')+ 5))))

这将作为substr函数的参数.

如果instr(substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,'bldg')+5),' ')是,!= 0那么我想要那个值,否则我想要的值length(substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,'bldg')+5))

是否有捷径可寻?

pat*_*icK 14

您可以使用 NVL(NULLIF(A,'0'), B)


Nat*_*han 7

由于原始帖子中的多余文字,我发现这两个答案都难以阅读。总结康拉德和克雷格的回答:

要复制 nvl(A,B) 但对于 0 而不是 null,您可以执行以下操作:

WHEN A != 0 THEN
  A
ELSE
  B
END
Run Code Online (Sandbox Code Playgroud)

或 Craig 的更紧凑(但其他人更难阅读):

NVL(NULLIF(A,0),B)
Run Code Online (Sandbox Code Playgroud)

我认为以下内容也有效:

DECODE(A,0,B,A)
Run Code Online (Sandbox Code Playgroud)


Con*_*rix 5

我认为您需要使用CASE

例如

WHEN instr(substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,'bldg')+5),' ') != 0 THEN
  length(substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,'bldg')+5))
ELSE
   Some Default
END as foo
Run Code Online (Sandbox Code Playgroud)


Cra*_*aig 5

从技术上讲,您可以通过减少键入来执行此操作:

nvl(
    nullif(instr(substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,'bldg')+5),' '),0),
    length(substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,'bldg')+5))
)
Run Code Online (Sandbox Code Playgroud)

但是,我通常会与Conrad一起建议您使用CASE,以便更容易确定代码的意图是什么用于将来的维护.