2016-02-26 52 views
5

Kendime birkaç tuş vuruşu kaydetmek için birden fazla sütun değerlendirmeye çalışıyorum (bu noktada, arama sonuçlarının zaman ve gayreti uzun zamandır aldığım herhangi bir "fayda" mesajını reddetti) Birden çok farklı karşılaştırma yerine. TemeldePL SQL - Çoklu sütun eşitliği

, ben:

WHERE column1 = column2 
AND column2 = column3 

Ben istiyorum :

WHERE column1 = column2 = column3 

bu diğer makale buldum, o teğet ilgili oldu: Oracle SQL Syntax - Check multiple columns for IS NOT NULL

+2

Bazı veritabanları sözdizimini destekler, ancak standart dışıdır. '' '' Versiyonu gitmek için yoldur. –

+1

@GordonLinoff, "AND" demek istemiyor musunuz? – goodguy5

cevap

5

Kullanım:

x=all(y,z) 

yerine

x=y and y=z 

yukarıdaki 1 tuş (- çok 1/11 =% 9) olarak kaydeder.

column1=column2 AND column2=column3 

ise bu sadece

column1=ALL(column2,column3) 

Fakat bu sefer 28 (:

bu uzun 35 karakterdir: sütun adları uzunsa

, sonra daha büyük tasarrufunu sağlar, 95 karakter):

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

alırsınız 43/95 = neredeyse% 50 tasarruf

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

ALL operatör ANSII SQL bir parçasıdır, en veritabanları tarafından desteklenmektedir (MySQL, PostgreSQL, SQL Server vb
http://www.w3resource.com/sql/special-operators/sql_all.php

nasıl çalıştığını gösterir

basit test durumu:

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

Bunu yarın işte denemek için çok heyecanlıyım. Çalışırsa bu cevabı doğru olarak işaretleyeceğim. – goodguy5

+0

Harika çalıştı! Çok teşekkür ederim. Bunu tüm SQL "arkadaşlarına" göstermek için çok heyecanlıyım. Bununla ilgili bir sorum var, ancak: Fark yaratan herhangi bir performans etkisi var mı? benim sorgum ** SEEMED ** daha yavaş, ancak veri setleri üzerinde kayda değer herhangi bir test yapmadım. (Bunu analiz etmenize gerek yok, eğer bilmiyorsanız, zaten yeterince yaptınız;)) – goodguy5

2

olası bir hüner etmektir least ve greatest işlevlerini kullanın - eğer En büyük ve değerlerin listesi en küçük değerleri, tüm değerleri eşit eşit demek olmalı gibidir:

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

Ben bir üç sütun listedeki herhangi tuş vuruşlarını kaydeder emin değilim, ama fazla sütun varsa Bazı karakterleri kurtarabilirdi. Bu çözümün hiçbiri değerlerin hiçbirinin null olduğunu kabul etmediğini, ancak orijinal çözümünüzü de ima ettiğini, bu nedenle tamamının olması gerektiğini varsayalım.

+1

Sayısal olmayan bir öğe ile çalışacak mı? Bir isim/adres gibi mi? Ama aksi halde, fikir için teşekkürler! – goodguy5

+1

@ goodguy5 yup, "en az" ve "en iyi" herhangi bir sıralama türüyle çalışmalıdır (karakter türleri, tarihler, vb. Gibi) – Mureinik

+0

@Mureinik col1 = col2 VE col2 = col3 '27 karakterden oluşurken LEAST (col1, col2, col3) = BÜYÜK (col1, col2, col3) '52 kırığa sahiptir, bu yüzden herhangi bir tuş vuruşu – krokodilko