NVL函数如何在oracle内部工作

时间:2016-05-26 14:38:27

标签: oracle

任何人都可以解释这个内部执行的查询。

 SELECT NVL(CELL.PERSONAL_NUMBER,
  (SELECT DTL.MSISDN_NUMBER
  FROM TABLE_DTL DTL
  WHERE DTL.MSISDN_DTL_ID=CELL.MSISDN_ID
  AND DTL.IS_ACTIVE      =CELL.IS_ACTIVE
  AND CELL.IS_ACTIVE     ='Y'
  )) AS NMS_NUMBER
FROM TABLE_1 prem,
  TABLE_CELL CELL
WHERE PREM.allocated_to=CELL.ENT_ORG_ID
AND PREM.mobile_number =12032456
AND PREM.id     =CELL.id
AND PREM.IS_ACTIVE     =CELL.IS_ACTIVE
AND PREM.IS_ACTIVE     ='Y'
AND PREM._ID     =18;

请详细解释此查询。

2 个答案:

答案 0 :(得分:2)

虽然由于代码是专有的,我们无法确切知道NVL是如何实现的,但我们知道NVL总是执行传入的两个参数。

您可能认为这没有任何影响,特别是如果您使用文字值(例如nvl(col1, 'value')),如果您在第二个参数中使用函数它会产生影响 - 它们将始终被执行,从下面的测试用例中可以看出:

CREATE SEQUENCE test_seq
  START WITH 1
  MAXVALUE 999999999999999999999999999
  MINVALUE 1
  NOCYCLE
  CACHE 20
  NOORDER;

create or replace function test_fn
return number
is
begin
  return test_seq.nextval;
end;
/

select nvl(1, test_fn()) test_1
from   dual;

    TEST_1
----------
         1

select nvl(null, test_fn()) test_2
from   dual;

    TEST_2
----------
         2

注意结果是2,而不是1?这表明序列已被调用两次 - 每次调用一次。

另一方面,

COALESCE确实会发生短路;它不会处理超过第一个非null参数的任何参数,如下所示:

select coalesce(1, test_fn()) test_3
from   dual;

    TEST_3
----------
         1

select coalesce(null, test_fn()) test_4
from   dual;

    TEST_4
----------
         3

看看TEST_4的值是3,而不是4?这表明test_fn仅被执行一次 - 当值为null时。

答案 1 :(得分:0)

我们无法了解NVL的工作原理。但是,NVL用值替换空字符串或null。因此,如果CELL.PERSONAL_NUMBER为空或为空,则会被以下查询输出

替换
SELECT DTL.MSISDN_NUMBER
  FROM TABLE_DTL DTL
  WHERE DTL.MSISDN_DTL_ID=CELL.MSISDN_ID
  AND DTL.IS_ACTIVE      =CELL.IS_ACTIVE
  AND CELL.IS_ACTIVE     ='Y' 

https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_functions_2048.htm \