2014-02-11 61 views
2

我需要使用表的可空列上列的值選擇三個整數值中的一個。在SQL查詢中選擇值vs(Java)代碼

至少有兩種方法:1)使用SQL來完成所有工作:測試空值,並在其他值之間進行選擇;或者2)讀取值並使用代碼 - 在這種情況下Java可以選擇。

哪一個是「更好」的,即。更容易理解&更易維護?您是否有其他度量標準用於決定?

舉個例子,我有以下代碼:

// If id is equal to: 
// -1, then make v = 1 
// null, then make v = 2 
// in any other case, make v = 3 

// Option 1: 
int v; 
String query = "SELECT CASE min(Id) WHEN NULL THEN 2 WHEN -1 THEN 1 ELSE 3 END AS Id" 
     + "FROM TableA WHERE SomeField IN (SELECT ...blah blah...)"; 
ResultSet rs = // execute query 
if (rs.next()) { 
    v = rs.getInt("Id"); 
} else { 
    // TODO something went *very* wrong... 
} 

// Option 2: 
int v; 
String query = "SELECT CASE min(Id) Id" 
     + "FROM TableA WHERE SomeField IN (SELECT ...blah blah...)"; 
ResultSet rs = // execute query 
if (rs.next()) { 
    final int id = rs.getInt("Id"); 
    if (rs.wasNull()) { 
     v = 2; 
    } else if (id == -1) { 
     v = 1; 
    } else { 
     v = 3; 
    } 
} else { 
    // TODO something went *very* wrong... 
} 
+1

我會去SQL如果查詢是不是很* *複雜(指執行在合理的時間)。如果查詢是10分鐘,最好嘗試java。但是,如果數據庫可以爲我完成這項工作,我總是會採用prefere sql方法。 –

+0

@ThrashBean我並不是故意粗魯,但有人可能會爭辯說*系統中的很多工作都可以在數據庫中完成。我用巨大的老闆說他希望使用存儲過程來開發*所有* web應用程序:)但是,我將您關於查詢複雜性的評論作爲考慮的一個很好的指標。你是否介意將它作爲答案發布,以便我可以對它進行升級? –

+0

給你。不要忘記檢查執行時間,只需在查詢前後添加一些currentTimeMillis即可。 –

回答

1

我說有SQL做的工作。這是相當微不足道的,不會浪費CPU時間,SQL將不得不在內存中加載相關信息,因此它已經在那裏進行處理。在應用程序方面,在某種程度上,似乎必須「重新」分析數據,而(imho)java代碼似乎更難以閱讀和理解。

請注意,您的SQL代碼存在一個小缺陷,您不能在case語句中以這種方式使用WHEN NULL。你會想要類似

...case 
    when min(Id) is null then 2 
    when min(Id) = -1 then 1 
    else 3 
    end 
+0

謝謝。因此,CPU時間和已經加載的信息在哪裏可以作爲考慮的良好指標。關於SQL代碼,我正在使用Sybase ASE,並且它在測試中不顯示任何錯誤。但是,使用'當min(Id)'顯示'不正確的語法附近'='「。 –

+0

糟糕 - 我的SQL評論基於MS SQL Server。我想處理空值的語法因製造商而異。 –

1

如果查詢不是很複雜(意味着在合理的時間內執行),我會去SQL。如果查詢是10分鐘,最好嘗試java。但是,如果數據庫可以爲我完成這項工作,我總是會採用prefere sql方法。

(只是我的意見的副本)

+0

查詢的複雜性是考慮......的一個很好的指標。 –