为了简化/概括我的SQL,我想使用这段代码:
SELECT ... FROM ... WHERE ColumnName LIKE '[To_be_replaced]'
如果我的gui的某个字段为空,我想要替换" To_be_replaced" by"%":
SELECT ... FROM ... WHERE ColumnName LIKE '%'
但如果它包含某些内容,[To_be_replaced]"被替换为内容,如下所示:
SELECT ... FROM ... WHERE ColumnName LIKE 'foo'
我的问题是:所有(或主要的)SQL引擎都会优化此代码,只需忽略类似内容的条件是"%"一个人?
答案 0 :(得分:3)
Oracle不会忽略它。实际上,Oracle不符合SQL标准;对于Oracle,长度为零的字符串与NULL相同,并且与NULL的比较永远不会为TRUE。
Oracle优化器(以及Oracle“逻辑”,无论“优化器”如何)都将where str_column LIKE '%'
解释为与where str_column IS NOT NULL
相同。并且,通过EXPLAIN PLAN来判断它即使在那时也不会忽略LIKE条件。 EXPLAIN PLAN显示两个过滤器的AND:is not null
和like '%'
条件,即使后者应该被省略。
在任何情况下,在Oracle中完全省略LIKE条件会产生不同的结果(由于Oracle对空字符串的非标准处理)。
已添加:Duh!在任何 DBMS中,与NULL
的比较永远不会评估为TRUE,因此...like '%'
等同于is not null
。即使是马也知道 - 即使是没有名字的马(见下面的评论)。我不知道我在想什么。
无论哪种方式,Oracle EXPLAIN PLAN都显示is not null
条件,并且它仍然显示like '%'
条件。它没有被优化掉。
此外:我创建了一个包含专门声明not null
的列的表。虽然现在like '%'
过滤器不再存在(出于显而易见的原因),但{EXPLER PLAN中仍然存在is not null
过滤器。