gpt4 book ai didi

sql - 像 where 子句 : is it always ignored 中的 '%'

转载 作者:行者123 更新时间:2023-12-01 01:55:33 25 4
gpt4 key购买 nike

为了简化/概括我的 SQL,我想使用以下代码:

SELECT ... FROM ... WHERE ColumnName LIKE '[To_be_replaced]'

如果我的 gui 的某个字段为空,我想用“%”替换“To_be_replaced”:
SELECT ... FROM ... WHERE ColumnName LIKE '%'

但如果它包含某些内容,[To_be_replaced]"将替换为内容,如下所示:
SELECT ... FROM ... WHERE ColumnName LIKE 'foo'

我的问题是:当 like 的内容是“%”时,所有(或主要)SQL 引擎是否通过简单地忽略 where 条件来优化此代码?

最佳答案

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 对空字符串的非标准处理)。

已添加 : 呸!在任何 DBMS 中与 NULL 的比较从不评估为 TRUE,所以 ...like '%'相当于 is not null .即使是一匹马也知道——即使是没有名字的马(见下面的评论)。我不知道我在想什么。

无论哪种方式,Oracle EXPLAIN PLAN 都会显示 is not null条件,它仍然显示 like '%'条件也一样。它没有被优化掉。

进一步:我创建了一个表,其中包含专门声明的列 not null . like '%'过滤器仍然存在于解释计划中,即使现在 is not null过滤器不再存在(出于明显的原因)。

关于sql - 像 where 子句 : is it always ignored 中的 '%',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41021152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com