(A!= B!= C)的含义与Oracle中的(A!= B或A!= C或B!= C)相同吗

时间:2018-07-11 14:46:56

标签: oracle

我认为某些语言在做:

(A1 != A2 != A3)

与以下内容相同:

(A1 != A2 or A1!= A3 or A3 != A2) 

在Oracle中也是这样吗?还是有另一种不那么重复的方式来完成此任务?

2 个答案:

答案 0 :(得分:6)

在Oracle中,a1 != a2 != a3构造 不是有效的谓词

 select * from tst where a1 != a2 != a3;

给予

 ORA-00933: SQL command not properly ended

请参见Comparison Conditions

的Oracle语法

可以做什么(以及在SQL中较少使用的IMO是)Group Comparison Conditions

a1 != ANY (a2,a3)如果列表的至少一个元素的表达式为TRUE,则返回TRUE

a1 != ALL (a2,a3)如果列表的所有元素的表达式均为TRUE,则返回TRUE

简单的例子

select * from tst order by a1,a2,a3;

        A1         A2         A3
---------- ---------- ----------
         1          1          1 
         1          1          2 
         1          2          1 
         1          2          2 

select * from tst where  a1 != ANY (a2,a3)  order by a1,a2,a3;

        A1         A2         A3
---------- ---------- ----------
         1          1          2 
         1          2          1 
         1          2          2 


select * from tst where  a1 != ALL (a2,a3)  order by a1,a2,a3;

        A1         A2         A3
---------- ---------- ----------
         1          2          2 

之所以很少使用,是因为IMO的表达方式不是很直观。使用ANDOR进行的特惠组合更为IMO直观。

答案 1 :(得分:3)

两件事:

1)(A1 != A2 != A3) <=> (A1 != A2 or A1!= A3 or A3 != A2) 不正确

反例:

1 != 2 != 1 
A1   A2   A3
1 != 1   (obviously false)  from equivalent form A1!= A3

2)您需要考虑NULL,将任何与NULL的值进行比较都会得出NULL

编辑

要澄清@hvd's comment

  

此答案不正确。您的反例假设A1!= A2!= A3必须表示(A1!= A2)!= A3或A1!=(A2!= A3)之一。并非所有语言都正确。 OP声称某些语言的行为不同是正确的。示例:python3.6 -c'print(1!= 2!= 1)'打印True。

整个(A1 != A2 != A3) <=> (A1 != A2 or A1!= A3 or A3 != A2) 不是重言式

Python中的反例:

>>> print(1 != 1 != 2)
False
>>> print(1!=1 or 1!=2 or 2!=1)
True

应该是:

# A1 != A2 AND A2 != A3
>>> print(1!=1 and 1!=2)
False