如果为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))
是否有捷径可寻?
由于原始帖子中的多余文字,我发现这两个答案都难以阅读。总结康拉德和克雷格的回答:
要复制 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)
我认为您需要使用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)
从技术上讲,您可以通过减少键入来执行此操作:
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,以便更容易确定代码的意图是什么用于将来的维护.