构建 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 语句的更好方法?的主要内容,如果未能解决你的问题,请参考以下文章