2016-02-26 44 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 

,而這其中只有28

column1=ALL(column2,column3) 

但對於這一個( 95個字符):

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

你會得到九十五分之四十三=近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「朋友」展示這一點。但是,我確實有一個問題:它是否有任何明顯的性能影響?我的查詢** SEEMED **速度較慢,但​​我沒有對數據集做任何可觀的測試。 (不需要分析,如果你不知道,你已經做得足夠了;)) – goodguy5

2

一個可能的訣竅是利用leastgreatest函數 - 如果最大和值的列表中最小的值相等,就一定意味着所有的值相等:

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

我不知道它節省了三列的列表上的任何按鍵動作,但如果你有很多列,它可以保存一些字符。請注意,此解決方案隱含假設沒有任何值是null,但您的原始解決方案也是這樣,所以它應該沒問題。

+1

這是否適用於非數字項目?像名稱/地址/你有什麼? 但是,除此之外,感謝您的想法! – goodguy5

+1

@ goodguy5 yup,'least'和'most'應該適用於任何排序類型(例如字符類型,日期等) – Mureinik

+0

@Mureinik'col1 = col2 AND col2 = col3'有27個字符,而'LEAST(col1, col2,col3)= GREATEST(col1,col2,col3)'有52個字符,所以我懷疑這是否節省了任何擊鍵 – krokodilko