喜欢'%' in where子句:它总是被忽略

时间:2016-12-07 15:19:58

标签: sql

为了简化/概括我的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引擎都会优化此代码,只需忽略类似内容的条件是"%"一个人?

1 个答案:

答案 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 nulllike '%'条件,即使后者应该被省略。

在任何情况下,在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过滤器。