Oracle SQL子句“!”=任何(……)”;及;不在(…)”中;
我使用的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'); 上面的查询按照我
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');