栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用绑定和空值命中Oracle索引的最佳查询

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用绑定和空值命中Oracle索引的最佳查询

您可以比较列和值以查看两者是否为空;或两者都不为空且相等:

SELECt * FROM MYTABLE WHERe ((A is null and :1 is null) or A = :1)   AND ((B is null and :2 is null) or B = :2)   AND ((C is null and :3 is null) or C = :3)   AND ((D is null and :4 is null) or D = :4)   AND ((E is null and :5 is null) or E = :5)

这不是很漂亮,但应该可以工作。如您所知,您不能将带有相等值的null与值进行比较,只能将

is
运算符进行比较。

根据客户端软件的不同,您也许可以使用命名绑定变量来避免重复绑定。如果不是,则可以使用接受绑定的子查询或CTE,然后在主查询中使用它们。就像是:

WITH CTE AS (  SELECt :1 AS val_1, :2 AS val_2, :3 AS val_3, :4 AS val_4, :5 AS val_5  FROM DUAL)SELECt MT.*FROM CTEJOIN MYTABLE MT  ON ((MT.A is null and CTE.val_1 is null) or MT.A = CTE.val_1)  AND ((MT.B is null and CTE.val_2 is null) or MT.B = CTE.val_2)  AND ((MT.C is null and CTE.val_3 is null) or MT.C = CTE.val_3)  AND ((MT.D is null and CTE.val_4 is null) or MT.D = CTE.val_4)  AND ((MT.E is null and CTE.val_5 is null) or MT.E = CTE.val_5)

只要您确实无法拥有任何魔法值为零的列,戈登的基于函数的索引方法可能会更可靠且更易于理解。(我也错过了您的问题中的那一行,并且没有意识到您已经对此轻描淡写了!)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/441426.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号