任何人都可以解释这个内部执行的查询。
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;
请详细解释此查询。
答案 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 \