PL/SQL IF THEN语句的更好结构方式是什么?

3

想知道在ORACLE中是否有更好的方法来编写以下PL/SQL代码?

IF(p_c_courtesies_cd is not null 
OR  p_c_language_cd is not null
OR v_c_name is not null
OR v_c_firstname is not null
OR v_c_function is not null
OR p_c_phone is not null
OR p_c_mobile is not null
OR p_c_fax is not null
OR v_c_email is not null
) THEN
     -- Do something
END IF;
4个回答

9
If coalesce( expr1, expr2, ... expr_n ) is not null then do something end if;

点击这里查看。

(感谢Tony的纠正)


1
不确定我同意这更好。这更短。原来的确实传达了意图。 - Dave Costa
2
在原始代码中,您必须阅读每一行,包括“OR”和“IS NOT NULL”的内容 - 如果其中一行错误地写成了“IS NULL”,那么可能会被忽略(尽管格式化可能有所帮助)- 然而,COALESCE函数更加简洁,完美地传达了意图。 - Jeffrey Kemp

2

我的答案很简单:“不需要”。

虽然有几种编写相同结构的替代方式,但我认为没有任何一种是必然“更好”的。

任何人都可以看到IF语句并知道它的意思。基于连接或使用合并运算符的替代方案只会使意图变得模糊。


1
+1 所有其他方法(包括我的方法)虽然能减少打字,但会牺牲意义的清晰度。如果原始陈述不是效果最佳,我也不会感到惊讶。 - Tony Andrews
我会说那些不会读COALESCE并且不去阅读文档的人,不适合从事编程行业。 - Stew S
1
也许是吧,但它除了降低清晰度之外并没有添加任何内容。 - Nick Pierpoint

1
如果 coalesce(expr1,expr2,...exprn) 不是 null,则 ...

0
另一种方法是利用Oracle将NULL和''视为相同的事实:
IF p_c_courtesies_cd 
   || p_c_language_cd 
   || v_c_name 
   || v_c_firstname 
   || v_c_function 
   || p_c_phone 
   || p_c_mobile p_c_fax 
   || v_c_email is not null
THEN
     -- Do something
END IF;

尽管这在Oracle中可以运行,但请记住它不符合SQL-92标准。请参见https://dev59.com/GUbRa4cB1Zd3GeqPy0vJ - DCookie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接