2016-02-26 11 views
5

Sto provando a valutare più colonne per risparmiare un paio di battute (concesso, a questo punto, il tempo e lo sforzo della ricerca ha da tempo negato qualsiasi "beneficio" che avrei mai ricevuto) piuttosto che più confronti diversi.PL SQL - Parità di colonne multiple

Fondamentalmente, ho:

WHERE column1 = column2 
AND column2 = column3 

ho voglio:

WHERE column1 = column2 = column3 

ho trovato questo altro articolo, che era tangenzialmente correlato: Oracle SQL Syntax - Check multiple columns for IS NOT NULL

+2

Alcuni database supportano tale sintassi ma sono altamente non standard. La versione 'OR' è la strada da percorrere. –

+1

@GordonLinoff, non intendi 'AND'? – goodguy5

risposta

5

Usa:

x=all(y,z) 

invece di

x=y and y=z 

È possibile che questo consente di risparmiare 1 tasto (1/11 = 9% - non molto).

Se i nomi di colonna sono più lunghi, allora si dà il risparmio più grandi:

Si tratta di 35 caratteri:

column1=column2 AND column2=column3 

mentre questo solo 28

column1=ALL(column2,column3) 

Ma per questo uno (95 caratteri):

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

si otterrà 43/95 = quasi 50% di risparmio

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

ALL operatore è una parte di ANSII SQL, è supportato dalla maggior parte dei database (MySQL, PostgreSQL, SQLServer ecc
http://www.w3resource.com/sql/special-operators/sql_all.php


Un caso semplice test che mostra come funziona:

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

Sono così eccitato di provarlo domani al lavoro. Segnerò questa risposta corretta se funziona. – goodguy5

+0

Ha funzionato alla grande! Grazie mille. Sono così felice di mostrarlo a tutti i miei "amici" di SQL. Tuttavia, ho una domanda al riguardo: ha qualche impatto notevole sulle prestazioni? la mia query ** è SEMPRE ** più lenta, ma non ho effettuato test apprezzabili sui set di dati. (non c'è bisogno di analizzarlo, se non lo sai, hai già fatto abbastanza;)) – goodguy5

2

Una possibile trucco è quello di utilizzare le funzioni least e greatest - se il più grande e più piccolo dei valori di un elenco di valori sono uguali, si deve dire tutti i valori sono uguali:

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

non sono sicuro che consente di salvare le combinazioni di tasti su una lista di tre colonne, ma se si dispone di molte colonne , potrebbe salvare alcuni personaggi. Si noti che questa soluzione presuppone implicitamente che nessuno dei valori sia null, ma anche la soluzione originale, quindi dovrebbe essere OK.

+1

Funzionerà con un elemento non numerico? Come un nome/indirizzo/che cosa hai? Altrimenti, grazie per l'idea! – goodguy5

+1

@ goodguy5 yup, 'least' e' greatest' dovrebbero funzionare con qualsiasi tipo di ordinamento (come tipi di caratteri, date, ecc.) – Mureinik

+0

@Mureinik 'col1 = col2 AND col2 = col3' ha 27 caratteri, mentre' MENO (col1, col2, col3) = GREATEST (col1, col2, col3) 'ha 52 caratteri, quindi dubito che questo salvi qualsiasi tasto premuto – krokodilko