2009-01-28 138 views
1

我會通過工作一些舊的存儲過程,不斷遇到SQL CASE語句對戰條件語句編程語言

CASE MyColumn WHEN 'Y' THEN 'Yes' WHEN 'N' THEN 'No' ELSE 'Unknown' END 

它得到時,這是不依賴於一個字更有甚者,而是一個顏色。

CASE MyColumn WHEN 'Y' THEN 'style="background-color:pink"' ELSE '' END 

這樣做的原因是老年人ASP 1頁這裏的一切都必須在線完成,但因爲它是這樣一個龐大的系統,這是不可能跟上更新所有網頁。

任何人都可以提供任何有效的證據證明,對條件語句使用SQL查詢超過了其他語言(如C#或Java)中的查詢嗎?這是速度的好習慣嗎?應該返回普通值並且表示層決定應該做什麼?

回答

3

當速度本質上,SQL case語句甚至可能是最快的(我將運行一個測試),但爲了可維護性,將普通值返回到表示層(或某個業務層thingy)是最好的選項。

[更新]運行了一些快速和骯髒的測試(代碼如下),發現C#代碼變體比SQL變體略快。結論:返回「原始」數據並在表示層中操作它既快又可維護。

-Edoode

我檢索了下面的查詢196288行。

StringBuilder result = new StringBuilder(); 
using (SqlConnection conn = new SqlConnection(Settings.Default.Conn)) 
{     
    conn.Open(); 
    string cmd = "select [state], case [state] when 'ca' then 'california' else [state] end from member"; 
    SqlCommand command = new SqlCommand(cmd, conn); 
    using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection)) 
    { 
     while (reader.Read()) 
     {       
      result.AppendLine(reader.GetString(1)); 
     } 
    } 
} 

C#變種:

StringBuilder result = new StringBuilder(); 
using (SqlConnection conn = new SqlConnection(Settings.Default.Conn)) 
{ 

    conn.Open(); 
    string cmd = "select [state] from member"; 
    SqlCommand command = new SqlCommand(cmd, conn); 
    using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection)) 
    { 
     while (reader.Read()) 
     { 
      result.AppendLine(reader.GetString(0) == "ca" ? "california" : reader.GetString(0)); 
     } 
    } 

}

+0

正是我在找的東西。 TA! – Kezzer 2009-01-28 15:24:17

2

我會擔心把這種邏輯放在SQL語句中。如果你的數據庫引擎改變會發生什麼你需要將每條SQL語句更新到Oracle SQL嗎?如果存儲庫本身發生變化,當您移動到消息總線,XML文件或Web服務時,會怎麼樣?

看起來您正在存儲顯示信息。在這種情況下,它是數據模型的一部分。讓控制器(在典型的MVC pattern中)執行條件邏輯。表示層不需要知道發生了什麼,存儲庫可以很高興地保存數據。

+0

這正是我希望聽到的,但在速度方面,你有什麼想法? – Kezzer 2009-01-28 14:24:44

+0

關於速度......這可以忽略不計。通過將其移至客戶端,您無需任何關心。 – 2009-01-28 14:27:23

0

誰能給任何有效的證據表明,使用SQL查詢條件語句超過在其他語言如C#或Java?這是速度的好習慣嗎?應該返回普通值並且表示層決定應該做什麼?

有時(有時)它只是有助於避免表示層中的額外編碼。

通常,如果數據庫和演示文稿都是由一個人開發的,則無關緊要。問題從工作分享時開始。在這種情況下,顯然,您需要一份關於數據庫排放和ASP接受的合同。

當然,CSS屬於表示層的域,它應該由ASP解析,而不是在SQL中進行硬編碼。

0

這就是老式的代碼,我不相信人這樣的代碼了(我們使用CSS現在)
你可能正在尋找一些即將原有的東西將被重寫或廢棄

0

在SQL性能的條款,如果你只返回幾行(或者只是返回一行),這會影響最小,因爲語句的WHERE部分是在case之前求值的(這種情況只會在匹配哪裏)。

從最佳實踐的角度來看,顯示信息不應該在SQL中確定。也許返回一個主題類型,但肯定不是謹慎的風格信息。

0

同意100%重構將展示決策放到表示層(或儘可能接近)。

CASE ... END在SQL中仍然可以有它的用途,例如,假設我想計算所有爲國內客戶訂購的總價值的百分比。我想我會很高興與

SELECT 
    SUM(CASE domestic WHEN 'Y' THEN order_value ELSE 0 END)/SUM(order_value) AS pctg 
FROM orders 

作爲查詢。當然,除非有人知道更好。