2009-01-28 131 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 

作为查询。当然,除非有人知道更好。