加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

oracle – 搜查WHERE子句中的参数是否为NULL

发布时间:2021-03-05 15:09:49 所属栏目:站长百科 来源:网络整理
导读:我碰着了一个必要永世执行的存储进程.这长短常大的,我可以领略,我会花一些时刻,但这一次一连快要20分钟. 颠末一些调试和研究后,我留意到替代了WHERE子句的这一部门; ((p_DrumNo IS NULL) OR T_ORDER.ORDER_ID IN (SELECT ORDER_ID FROM ORDERDELIVERY)) 发了

我碰着了一个必要永世执行的存储进程.这长短常大的,我可以领略,我会花一些时刻,但这一次一连快要20分钟.

颠末一些调试和研究后,我留意到替代了WHERE子句的这一部门;

((p_DrumNo IS NULL) OR T_ORDER.ORDER_ID IN (SELECT ORDER_ID FROM ORDERDELIVERY))

发了很大的变革.以是只要p_DrumNo为NULL,可能我修改上面的内容就不搜查p_DrumNo是否为NULL,措施就可以正常事变;

(T_ORDER.ORDER_ID IN (SELECT ORDER_ID FROM ORDERDELIVERY))

此WHERE子句的方针是在p_DrumNo上转达功效集,假如它传入存储进程.然后WHERE子句继承进一步的前提,但这个特定的前提遏制查询.

ORDERDELIVERY只是一个包括与参数p_DrumNo相干的ORDER_ID的姑且表.

这个简朴的IS NULL搜查怎么会造成云云大的影响呢?它也许与OR与子查询一路行使有关,但我不大白为什么子查询自己事变得很好.

提前叩谢!

更新[2011-09-23 10:13]

我将题目解析为表现沟通举动的小查询;

例A

SQL查询

SELECT * FROM T_ORDER WHERE
('290427' IS NULL OR ORDER_ID IN (SELECT ORDER_ID FROM T_ORDER WHERE ORDERNO LIKE '290427%') );

执行打算

OPERATION   OBJECT_NAME     OPTIONS     COST
------------------------------------------------------------
SELECT STATEMENT                    97
FILTER
TABLE ACCESS    T_ORDER         FULL        95
TABLE ACCESS    T_ORDER         BY INDEX ROWID  2
INDEX       PK_ORDER        UNIQUE SCAN 1

例B

SQL查询

SELECT * FROM T_ORDER WHERE
( ORDER_ID IN (SELECT ORDER_ID FROM T_ORDER WHERE ORDERNO LIKE '290427%') );

执行打算

OPERATION   OBJECT_NAME     OPTIONS     COST
------------------------------------------------------------
SELECT STATEMENT                    4
NESTED LOOPS                        4
TABLE ACCESS    T_ORDER         BY INDEX ROWID  3
INDEX       IX_T_ORDER_ORDERNO  RANGE SCAN   2  
TABLE ACCESS    T_ORDER         BY INDEX ROWID  1  
INDEX       PK_ORDER        UNIQUE SCAN 0

各人可以看到第一个查询(例子A)举办全表扫描.关于怎样停止这种环境的任何设法?

办理要领

不是在SQL语句自己中评估进程的参数状态,而是将该评估移动到包括的PL / SQL块,以便在提交抱负的SQL语句之前只执行一次.譬喻:

CREATE OR REPLACE PROCEDURE my_sp (p_DrumNo VARCHAR2)
IS
BEGIN
    IF p_DrumNo IS NULL THEN
        SELECT ...
        INTO ... -- Assumed
        FROM ...
        WHERE my_column = p_DrumNo;
    ELSE
        SELECT ...
        INTO ... -- Assumed
        FROM ...
        WHERE ORDER_ID IN (SELECT ORDER_ID FROM ORDERDELIVERY);
    END;
END;

通过行使UNION ALL将语句分成两个互斥语句,我在行使OR调优SQL语句方面也取得了一些乐成:

SELECT ...
FROM ...
WHERE p_DrumNo IS NULL
AND ORDER_ID IN (SELECT ORDER_ID FROM ORDERDELIVERY)
UNION ALL
SELECT ...
FROM ...
WHERE p_DrumNo IS NOT NULL
AND my_column = p_DrumNo;

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读