2016-02-26 23 views
5

Próbuję ocenić wiele kolumn, aby zaoszczędzić sobie kilku naciśnięć klawiszy (przyznane, w tym momencie czas i wysiłek poszukiwań już dawno zanegował jakąkolwiek "korzyść", jaką kiedykolwiek otrzymałem) zamiast wielu różnych porównań.PL SQL - Równanie wielu kolumn

Zasadniczo mam:

WHERE column1 = column2 
AND column2 = column3 

Chcę:

WHERE column1 = column2 = column3 

Znalazłem inny artykuł, który był luźno: Oracle SQL Syntax - Check multiple columns for IS NOT NULL

+2

Niektóre bazy danych obsługują tę składnię, ale jest ona bardzo niestandardowa. Wersja "OR" jest drogą do zrobienia. –

+1

@GordonLinoff, nie masz na myśli "ORAZ"? – goodguy5

Odpowiedz

5

Zastosowanie:

x=all(y,z) 

zamiast

x=y and y=z 

Powyższy zapisuje 1 klawisza (1/11 = 9% - nie dużo).

Jeśli nazwy kolumn są dłuższe, to daje większe oszczędności:

ten wynosi 35 znaków:

column1=column2 AND column2=column3 

gdy ten tylko 28

column1=ALL(column2,column3) 

Ale dla tego jednego (95 znaków):

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

dostaniesz 43/95 = prawie 50% oszczędności

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

ALL operator jest częścią ANSII SQL, jest on obsługiwany przez większość baz danych (MySQL, PostgreSQL, SQLServer itp
http://www.w3resource.com/sql/special-operators/sql_all.php


prosty przypadek testowy, który pokazuje jak to działa:

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

Jestem tak podekscytowany, aby spróbować się jutro w pracy. Zaznaczę tę odpowiedź poprawnie, jeśli się uda. – goodguy5

+0

Udało się świetnie! Dziękuję bardzo. Jestem tak podekscytowany, że mogę to pokazać wszystkim moim "znajomym" SQL. Mam jedno pytanie na ten temat: czy ma jakiś zauważalny wpływ na wydajność? moje zapytanie ** ** wydawało wolniej, ale nie robić żadnych znaczących badań nad zbiorami danych. (nie trzeba go analizować, jeśli nie wiesz, zrobiłeś już wystarczająco dużo;)) – goodguy5

2

Możliwym Sztuką jest korzystać z funkcji least i greatest - jeśli największe i najmniejsze wartości na liście wartości są równe, musi to oznaczać, wszystkie wartości są równe:

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

nie jestem pewien, że zapisuje wszystkie naciśnięcia klawiszy na liście trzy kolumny, ale jeśli masz wiele kolumn , może uratować niektóre postacie. Zauważ, że to rozwiązanie domyślnie zakłada, że ​​żadna z wartości nie jest null, ale tak samo jak twoje oryginalne rozwiązanie, więc powinno być OK.

+1

Czy to działa z elementem nielicznikowym? Jak imię/adres/co-masz-ty? Ale poza tym, dzięki za pomysł! – goodguy5

+1

@ goodguy5 yup, '' greatest' least' i powinny współpracować z dowolnego rodzaju zamówień (takich jak rodzaje znaków, dat, itp) – Mureinik

+0

@Mureinik 'col1 = col2 I col2 = col3' ma 27 znaków, podczas gdy' LEAST (col1, col2, Col3) = GREATEST (col1, col2, Col3) 'posiada 52 Charactes, więc wątpię, czy to oszczędza każdy klawiszy – krokodilko