2016-02-26 12 views
5

複数の列を評価して、いくつかのキーストロークを保存しようとしています(この時点で、検索の時間と労力は、複数の異なる比較よりむしろ。PL SQL - 複数の列の等価性

は基本的に、私が持っている:

WHERE column1 = column2 
AND column2 = column3 

私はをしたい

WHERE column1 = column2 = column3 

私はそれが接線方向に関連し、この他の記事を見つけました: Oracle SQL Syntax - Check multiple columns for IS NOT NULL

+2

一部のデータベースではその構文がサポートされていますが、非常に非標準です。 'OR'バージョンは道のりです。 –

+1

@GordonLinoff、あなたは 'AND'を意味しないのですか? – goodguy5

答えて

5

使用:

x=all(y,z) 

代わりに

x=y and y=z 

上記1つのキーストローク(1/11 = 9% - あまりない)を保存します。

列名が長い場合、それは大きな節約を与える:

これは35文字の長さ:

column1=column2 AND column2=column3 

この1つは唯一の28

column1=ALL(column2,column3) 

しかし、このいずれかの間( 95文字):

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

あなたは95分の43 =ほぼ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 
+0

明日は仕事でこれを試してみることにとても興奮しています。私はこの答えが正しく動作する場合はそれをマークします。 – goodguy5

+0

すごくうまくいった!どうもありがとうございます。私はこれをすべての私のSQL「友人」に示すことにとても興奮しています。私はそれについて1つの質問があります:それはどのような顕著なパフォーマンスの影響がありますか?私のクエリ**は**遅くなりましたが、私はデータセットに対してかなりのテストをしませんでした。 (それを分析する必要はありません、あなたが分かっていない場合は、すでに十分に行っています;)) – goodguy5

2

一つの可能​​なトリックにありますleastgreatest関数を使用します。最大と値のリストの最小値が等しい、それはすべての値が等しい意味する必要があります:

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

私はそれが3列リスト上の任意のキーストロークを節約わからないんだけど、あなたは多くの列を持っている場合いくつかの文字を保存することができます。このソリューションでは暗黙のうちに値のいずれもnullであると仮定していますが、元のソリューションと同じであるため、OKです。

+1

数字以外の項目でも使用できますか?あなたの名前/住所/あなたと同じように? しかし、そうでなければ、アイデアのおかげで! – goodguy5

+1

@ goodguy5うん、 'least'と' – Mureinik

+0

@Mureinik(例えば、文字の種類、日付、などなど)任意の順序タイプで動作するはずgreatest' 'COL2 = col1と= COL2 col3'は、しばらく' LEAST(COL1を27個の文字を持っています、 col2、col3)= GREATEST(col1、col2、col3) 'は52個の文字を持っているので、これがキーストロークを保存するかどうかは疑いありません。 – krokodilko