2016-02-26 5 views
5

Ich versuche, mehrere Spalten zu bewerten, um mir ein paar Tastenanschläge zu sparen (gewährt, an dieser Stelle, die Zeit und der Aufwand der Suche hat seit langem keinen "Vorteil" negiert, den ich jemals erhalten würde) anstatt mehrere verschiedene Vergleiche.PL SQL - Mehrere Spaltengleichheit

Grundsätzlich habe ich:

WHERE column1 = column2 
AND column2 = column3 

I wollen:

WHERE column1 = column2 = column3 

ich diesen anderen Artikel gefunden, das war tangential verwandte: Oracle SQL Syntax - Check multiple columns for IS NOT NULL

+2

Einige Datenbanken unterstützen diese Syntax, aber es ist sehr nicht standardkonform. Die 'OR'-Version ist der Weg zu gehen. –

+1

@GordonLinoff, meinst du nicht 'UND'? – goodguy5

Antwort

5

Verwendung:

x=all(y,z) 

statt

x=y and y=z 

Die oben spart 1 Tastendruck (1/11 = 9% - nicht viel).

Wenn Spaltennamen, die länger sind, dann gibt es größere Einsparungen:

Das ist 35 Zeichen lang:

column1=column2 AND column2=column3 

während dieses nur 28

column1=ALL(column2,column3) 

Aber für diesen einen (95 Zeichen):

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

Sie bekommen 43/95 = fast 50% Ersparnis

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

ALL Operator ist ein Teil von ANSII SQL, es von den meisten Datenbanken unterstützt (MySQL, PostgreSQL, SQL Server usw.
http://www.w3resource.com/sql/special-operators/sql_all.php


Ein einfacher Testfall, der zeigt, wie es funktioniert:

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

Ich bin so aufgeregt, dies morgen bei der Arbeit auszuprobieren. Ich werde diese Antwort korrekt markieren, wenn es funktioniert. – goodguy5

+0

Es hat super funktioniert! Ich danke dir sehr. Ich bin so aufgeregt, dies allen meinen SQL-Freunden zu zeigen. Ich habe jedoch eine Frage: Hat es irgendwelche spürbaren Auswirkungen auf die Leistung? meine Abfrage ** SEEMED ** langsamer, aber ich habe keine nennenswerten Tests über Datensätze durchgeführt. (keine Notwendigkeit, es zu analysieren, wenn Sie nicht wissen, haben Sie bereits genug getan;)) – goodguy5

2

Ein möglicher Trick ist, Verwenden Sie die least und greatest Funktionen - wenn die größten und die kleinsten Werte aus einer Liste von Werten, die gleich sind, muss es bedeuten, alle Werte sind gleich:

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

Ich bin nicht sicher, dass es keine Tastatureingaben auf drei Spaltenliste speichert, aber wenn Sie viele Spalten Es könnte einige Zeichen speichern. Beachten Sie, dass diese Lösung implizit davon ausgeht, dass keiner der Werte null ist, aber Ihre ursprüngliche Lösung auch, daher sollte es in Ordnung sein.

+1

Funktioniert das mit einem nicht numerischen Element? Wie ein Name/eine Adresse/was hast du? Aber sonst, danke für die Idee! – goodguy5

+1

@ goodguy5 yup, 'least' und' great' sollten mit jedem Befehlstyp funktionieren (zB Zeichentypen, Datumsangaben, etc.) – Mureinik

+0

@Mureinik 'col1 = col2 AND col2 = col3' hat 27 Zeichen, während' LEAST (col1, col2, col3) = GREATEST (col1, col2, col3) 'hat 52 Zeichen, also bezweifle ich, ob das einen Tastendruck speichert – krokodilko