Oracle SQL子句“!”=任何(……)”;及;不在(…)”中;

Oracle SQL子句“!”=任何(……)”;及;不在(…)”中;,sql,oracle,Sql,Oracle,我使用的SQL查询类似于: select * from FOO_TABLE ft where ft.foo_field != any ('A','B','C'); 我认为结果将是所有foo_字段不包含'A'或'B'或'C'(排除))的记录,但我获得了所有记录,以及那些foo_字段等于'A'或'B'或'C'的记录 为了避免上述问题,我使用了: select * from FOO_TABLE ft where ft.foo_field not in ('A','B','C'); 上面的查询按照我

我使用的SQL查询类似于:

select * from FOO_TABLE ft where ft.foo_field != any ('A','B','C');
我认为结果将是所有foo_字段不包含'A'或'B'或'C'(排除))的记录,但我获得了所有记录,以及那些foo_字段等于'A'或'B'或'C'的记录

为了避免上述问题,我使用了:

select * from FOO_TABLE ft where ft.foo_field not in ('A','B','C');
上面的查询按照我的预期运行

一、 通常,使用以下查询生成上述查询的逆查询(以获取包含“A”或“B”或“C”-的所有记录):

我认为这就是我使用的两个查询之间没有结果差异的原因。这是真的


为什么“独占性”“查询具有不同的行为?

我认为您误用了NOT(
)运算符

工作原理:

“column_name=ANY(…)”:该值必须与中的一个或多个值匹配 要计算为TRUE的列表

“column_name!=ANY(…)”:该值不能为空 匹配列表中要计算为TRUE的一个或多个值

在您的情况下,您的列值可以表示
'A'
=ANY('A','B','C')
匹配,但同时使用
=任何('A'、'B'、'C')
然后它也将作为
A!计算为
TRUE
=B或A=C

所以你必须使用
列名称=全部('A'、'B'、'C')
或使用
非列名称=ANY('A'、'B'、'C')
,如下所示:

任用

select * from FOO_TABLE ft where NOT ft.foo_field = any ('A','B','C'); 
 -- see the keyword NOT before column name


干杯

我认为您误用了NOT(
)运算符

工作原理:

“column_name=ANY(…)”:该值必须与中的一个或多个值匹配 要计算为TRUE的列表

“column_name!=ANY(…)”:该值不能为空 匹配列表中要计算为TRUE的一个或多个值

在您的情况下,您的列值可以表示
'A'
=ANY('A','B','C')
匹配,但同时使用
=任何('A'、'B'、'C')
然后它也将作为
A!计算为
TRUE
=B或A=C

所以你必须使用
列名称=全部('A'、'B'、'C')
或使用
非列名称=ANY('A'、'B'、'C')
,如下所示:

任用

select * from FOO_TABLE ft where NOT ft.foo_field = any ('A','B','C'); 
 -- see the keyword NOT before column name


干杯

我认为这两种方法是等效的,使用
ALL
而不是
中的

当考虑SQL中的这些构造时,可能要考虑的两个最重要的情况是:

  • 空集(只能使用子查询生成)
  • 空值
在这两种情况下,
中的
=any
的行为方式相同。类似地,
不在
所有
的行为方式相同


我应该指出,如果子查询中存在任何
NULL
s,则
all
可能不会像预期的那样工作。在本例中,它完全不返回任何内容。这就是为什么我推荐
不存在
而不是
不在

我认为它们是等效的,使用
所有
而不是

当考虑SQL中的这些构造时,可能要考虑的两个最重要的情况是:

  • 空集(只能使用子查询生成)
  • 空值
在这两种情况下,
中的
=any
的行为方式相同。类似地,
不在
所有
的行为方式相同


我应该指出,如果子查询中存在任何
NULL
s,则
all
可能不会像预期的那样工作。在本例中,它完全不返回任何内容。这就是为什么我建议
不存在
而不是
不存在

为什么我误用了操作符
。如果我通常写
where foo_field!='“
它运行正常吗?我不明白!对于所有和任何比较运算符,它们都有自己的概念。请尝试解决方案,并让我们知道它是否有帮助。为什么我误用了运算符
。如果我通常写
where foo_field!='“
它运行正常吗?我不明白!对于所有和任何比较运算符,它们都有自己的概念。请尝试解决方案,并让我们知道它是否有帮助。
select * from FOO_TABLE ft where ft.foo_field != ALL ('A','B','C');