oracle if 0,如果为null(nvl)

时间:2011-06-01 17:05:39

标签: oracle

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

  

nvl(instr(substr(ovrflo_adrs_info,instr(ovrflo_adrs_info,'bldg')+ 5),''),                 长度(SUBSTR(ovrflo_adrs_info,INSTR(ovrflo_adrs_info, 'ビ')+ 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))

的值

有一种简单的方法吗?

4 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分: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))
)

但是,我通常会与Conrad一起建议你使用CASE,这样就可以更容易地判断代码的意图是为了将来的维护。

答案 2 :(得分:4)

我认为您需要使用CASE

e.g。

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

答案 3 :(得分:4)

由于原帖的额外措辞,我发现这两个答案都难以阅读。总结康拉德和克雷格的答案:

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

WHEN A != 0 THEN
  A
ELSE
  B
END

或克雷格更紧凑(但其他人更难阅读):

NVL(NULLIF(A,0),B)

我认为以下内容也有效:

DECODE(A,0,B,A)