PL SQL - 多列相等

时间:2016-02-26 19:37:36

标签: sql oracle select where-clause equality

我试图评估多个列以节省一些键击(在这一点上,授予搜索的时间和精力早已否定了任何"好处"我会收到而不是多个不同的比较。

基本上,我有:

WHERE column1 = column2
AND column2 = column3

想要

WHERE column1 = column2 = column3

我发现了另一篇与切向相关的文章: Oracle SQL Syntax - Check multiple columns for IS NOT NULL

2 个答案:

答案 0 :(得分:5)

使用:

x=all(y,z)

而不是

x=y and y=z

以上节省了1次击键(1/11 = 9% - 不多)。

如果列名更长,则可以节省更多:

这是35个字符长:

column1=column2 AND column2=column3

虽然这只有28个

 column1=ALL(column2,column3)

但对于这个(95个字符):

column1=column2 AND column2=column3 AND column3=column4 
AND column4=column5 AND column5=column6

您将获得43/95 =几乎50%的节省

column1=all(column2,column3,column4,column5,column6)

ALL运算符是ANSII SQL的一部分,大多数数据库都支持它(Mysql,Postgresql,SQLServer等。
http://www.w3resource.com/sql/special-operators/sql_all.php

一个简单的测试用例,展示了它的工作原理:

create table t( x int, y int, z int );

insert all 
into t values( 1,1,1)
into t values(1,2,2)
into t values(1,1,2)
into t values(1,2,1)
select 1 from dual;

select *
from t
where x = all(y,z);

        X          Y          Z
---------- ---------- ----------
        1          1          1 

答案 1 :(得分:2)

一个可能的技巧是利用leastgreatest函数 - 如果值列表的最大值和最小值相等,则必须表示所有值都相等:

LEAST(col1, col2, col3) = GREATEST(col1, col2, col3)

我不确定它是否会在三列列表中保存任何击键,但如果您有多列,则可以保存一些字符。请注意,此解决方案隐含地假设这些值都不是null,但原始解决方案也是如此,因此它应该没问题。