2011-07-05 52 views
1

Oracle版本:10g中的Oracle SQL - 找到一個數據集的最小值,但在MIN計算中排除的值

我試圖使用MIN功能找到一個數據集的最小/最低值。我正在執行的列MINVARCHAR2列。該列將包含一個數字值,或值爲' - ',表示該值不適用。

當在列上執行MIN()函數時,總是返回' - '。
我想找到一種方法來排除' - '從MIN語句中計算。我無法在語句中使用WHERE子句來過濾出帶有' - '的列,因爲這會排除有效數據。

注意:這是一個巨大的遺留查詢(500多行),因此重寫這個大規模查詢並不是真正的選擇。

回答

6

MIN(CASE WHEN ColX = '--' THEN NULL ELSE ColX END)

這是在SQL Server中有效,我想可能會在Oracle上正常工作。

作爲一個附註,永遠不會在字符串字段中存儲數字數據。

從空間角度來看,它效率低下,在進行不等式比較時會得到一些奇怪的結果。

如果你在你的表中的這些行:

010 
009 
1 

MAX值將是1MIN值將是009

+0

我完全同意不將數字存儲爲varchar。我從中提取的列是varchar2的原因是因爲它是使用NVL函數來確定它是否應顯示' - '或數字的視圖。 – contactmatt

+0

@Contactmatt然後我會建議在其他表/程序中檢查對該視圖的引用並解決該問題。如果數據是'NULL',那麼我們傳遞'NULL'或者其他一些你知道數字的數值,比如'-2147483647' – JNK

3

真的只是想聚合函數,以避免該值。骨料跳過空值,所以在問題轉換值轉換成空:

min(case your_field 
    when '--' then null 
    else your_field 
    end) 

此外,作爲@JNK指出,存儲號碼作爲字符串是充滿了危險。例如,除非你的數字全部填充到相同的長度,否則min可能會給你錯誤的結果:作爲字符串,'1000'小於'2'。您可以使用floatint函數將您的字符串轉換爲實際的數字,但如果您在其中有任何其他非數字字符,則SQL將引發錯誤。

+0

謝謝你的幫助:) – contactmatt

相關問題