我认为某些语言在做:
(A1 != A2 != A3)
与以下内容相同:
(A1 != A2 or A1!= A3 or A3 != A2)
在Oracle中也是这样吗?还是有另一种不那么重复的方式来完成此任务?
答案 0 :(得分:6)
在Oracle中,a1 != a2 != a3
的构造 不是有效的谓词
select * from tst where a1 != a2 != a3;
给予
ORA-00933: SQL command not properly ended
的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的表达方式不是很直观。使用AND
和OR
进行的特惠组合更为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