构建 PL/SQL IF THEN 语句的更好方法?

Posted

技术标签:

【中文标题】构建 PL/SQL IF THEN 语句的更好方法?【英文标题】:Better way to structure a PL/SQL IF THEN statement? 【发布时间】:2009-01-20 16:16:15 【问题描述】:

只是想知道是否有更好的方法在 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;

【问题讨论】:

【参考方案1】:
If coalesce( expr1, expr2, ... expr_n ) is not null then do something end if;

See here.

(感谢托尼的纠正)

【讨论】:

不确定我是否同意这样更好。它更短。不过,原文确实传达了意图。 在原文中,您必须阅读每一行,包括“OR”和“IS NOT NULL” - 如果其中一行错误地说“IS NULL”,则可能会错过(虽然格式化会有所帮助) - 但是 COALESCE 函数更干净并且完美地传达了意图。【参考方案2】:

我的回答是简单的“不”。

虽然有几种替代方法可以编写相同的结构,但我认为没有一种方法一定“更好”。

任何人都可以查看 IF 语句并确切知道它的含义。基于连接或使用合并运算符的替代方案只会掩盖意图。

【讨论】:

+1 所有其他方法(包括我的)都可以节省 TYPING,但会牺牲含义的清晰性。如果最初的声明表现不佳,我不会感到惊讶。 Nick,我想说那个看不懂 COALESCE 也不会做一些 RTFM 的人是做错事了。 也许,但除了降低清晰度之外,它并没有增加任何东西。【参考方案3】:

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

【讨论】:

【参考方案4】:

另一种方式,利用 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 标准的行为。见***.com/questions/462471/…

以上是关于构建 PL/SQL IF THEN 语句的更好方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PL/SQL 块 (IF/THEN) 中执行“插入...选择...

oracleif判断语句

PL/SQL程序设计

Oracle之PL/SQL编程_流程控制语句

PL/SQL条件控制

Oracle PL/SQL 编程基础 实例 2