我希望删除查询中的NVL函数,因为没有它,查询运行得更快。我确信在我的执行计划中可能会有更好的事情,但这似乎是更好的sql,可以产生相同的结果。更大的查询更复杂,但这基本上是我想要更新where子句的方式。这是一个很好的替代品吗?如果没有,为什么不呢,什么会更好?
当前SQL(使用NVL):
SELECT *
FROM oe_order_lines_all ol
WHERE NVL(OL.LINK_TO_LINE_ID, OL.LINE_ID) = OL.LINE_ID
替换SQL:
SELECT *
FROM oe_order_lines_all ol
WHERE (OL.LINK_TO_LINE_ID IS NULL OR OL.LINK_TO_LINE_ID = OL.LINE_ID)
答案 0 :(得分:4)
是的,这两个查询在功能上是等价的,只要OL.LINE_ID本身永远不会为NULL,这可能是一个很好的假设......
这样打破它来证明它:
SELECT *
FROM oe_order_lines_all ol
WHERE NVL(OL.LINK_TO_LINE_ID, OL.LINE_ID) = OL.LINE_ID
与
相同SELECT *
FROM oe_order_lines_all ol
WHERE OL.LINK_TO_LINE_ID = OL.LINE_ID
OR OL.LINK_TO_LINE_ID IS NULL AND OL.LINE_ID = OL.LINE_ID
但由于当OL.LINE_ID不为NULL时OL.LINE_ID = OL.LINE_ID,这简化了第二个查询:
SELECT *
FROM oe_order_lines_all ol
WHERE OL.LINK_TO_LINE_ID = OL.LINE_ID
OR OL.LINK_TO_LINE_ID IS NULL
当然,如果OL.LINK_TO_LINE_ID为NULL时OL.LINE_ID为NULL,则OL.LINE_ID不等于OL.LINE_ID,您可能会有不同的结果。
答案 1 :(得分:1)
非答案答案:在两者上都做EXPLAIN PLAN
。
答案是:是的,它们是等同的。如果link_to_line_id
为空,则将line_id
与其自身进行比较,这始终为真。
但是,不要试图进一步扩展模式。它适用于这种特定情况,因为它用于过滤表中的结果。如果你将它作为来自不同表格的列的连接标准使用它,它将会失败。