我正在构建一个存储过程,它可以接收两个单独的值,每个值都可用于标识单个记录。这些值之一可能为空。
我的逻辑如下:如果IN_ORDER_ID
不为NULL,则将其保存到V_ORDER_ID
. 如果它是 NULL,则ORDER_ID
使用查询检索并将其保存到V_ORDER_ID
. V_ORDER_ID
然后在剩下的程序中使用。
这是代码:
SELECT COALESCE(IN_ORDER_ID, order_id) INTO V_ORDER_ID FROM SCHEMA.ORDER WHERE SXC_ORDER_NUMBER = IN_SXC_ORDER_NUMBER;
Run Code Online (Sandbox Code Playgroud)
我的问题:此查询中的合并是否仍会利用短路评估?
是的,根据文档:
数据库 SQL 语言参考 (Oracle 11g): COALESCE()
Oracle 数据库使用短路评估。数据库评估每个 expr 值并确定它是否为 NULL,而不是在确定它们中的任何一个是否为 NULL 之前评估所有 expr 值。
注意(我自己已经被这个烧毁了):警惕依靠概念证明来确定 SQL 语言中的操作顺序。SQL 是声明性的,并且引擎通常可以灵活地以任意顺序执行语句的某些部分。因此,仅仅因为一个临时示例显示操作 A、B、C 的执行顺序是 A-then-B-then-C,所以在不同情况下,引擎可能会选择替代执行顺序,例如,B-然后-A-然后-C。