Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL CASE语句与编程语言中的条件语句_Sql_Language Agnostic - Fatal编程技术网

SQL CASE语句与编程语言中的条件语句

SQL CASE语句与编程语言中的条件语句,sql,language-agnostic,Sql,Language Agnostic,我在工作中遇到一些旧的存储过程,并且经常遇到 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页面,所有的事情都必须内联完成,但由于它是一个如此大的系统,不可能跟上所有页面的更

我在工作中遇到一些旧的存储过程,并且经常遇到

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)吗?这是提高速度的好方法吗?是否应该返回普通值并由表示层决定应该做什么?

我关心的是将这种逻辑放在SQL语句中。如果数据库引擎发生更改,会发生什么情况?是否必须将每个SQL语句更新为Oracle SQL?当您移动到消息总线、XML文件或web服务调用时,如果存储库本身发生更改,该怎么办


看起来您正在存储显示信息。在这种情况下,它是数据模型的一部分。让控制器(在典型情况下)执行条件逻辑。表示层不需要知道发生了什么,存储库只需要保存数据就可以了。

我关心的是将这种逻辑放在SQL语句中。如果数据库引擎发生更改,会发生什么情况?是否必须将每个SQL语句更新为Oracle SQL?当您移动到消息总线、XML文件或web服务调用时,如果存储库本身发生更改,该怎么办


看起来您正在存储显示信息。在这种情况下,它是数据模型的一部分。让控制器(在典型情况下)执行条件逻辑。表示层不需要知道发生了什么,存储库只需要保存数据就可以了。

当速度至关重要时,SQL case语句甚至可能是最快的(我将运行一个测试),但为了可维护性,将普通值返回到表示层(或某些业务层)是最好的选择

[更新]运行了一些快速而肮脏的测试(下面的代码),发现C#代码变体比SQL案例变体略快。结论:返回“原始”数据并在表示层对其进行操作既更快,也更易于维护

-伊多德

我通过下面的查询检索到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#变体:


}

当速度至关重要时,SQL case语句甚至可能是最快的(我将运行一个测试),但为了可维护性,将普通值返回到表示层(或某些业务层)是最好的选择

[更新]运行了一些快速而肮脏的测试(下面的代码),发现C#代码变体比SQL案例变体略快。结论:返回“原始”数据并在表示层对其进行操作既更快,也更易于维护

-伊多德

我通过下面的查询检索到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#变体:

}

有人能提供有效的证据证明对条件语句使用SQL查询优于其他语言(如C#或Java)吗?这是提高速度的好方法吗?是否应该返回普通值并由表示层决定应该做什么

有时(有时)它只是有助于避免在表示层中进行额外的编码

一般来说,如果数据库和表示都是由一个人开发的,这并不重要。当工作被分享时,问题就开始了。显然,在这种情况下,您需要一个关于数据库发出什么和ASP接受什么的明确约定

当然,CSS属于表示层的域,应该由ASP解析,而不是用SQL硬编码

有人能提供有效的证据证明对条件语句使用SQL查询优于其他语言(如C#或Java)吗?这是提高速度的好方法吗?是否应该返回普通值并由表示层决定应该做什么

有时(有时)它只是有助于避免在表示层中进行额外的编码

一般来说,如果数据库和表示都是由一个人开发的,这并不重要。当工作被分享时,问题就开始了。显然,在这种情况下,您需要一个关于数据库发出什么和ASP接受什么的明确约定


当然,CSS属于表示层的领域,它应该由ASP解析,而不是用SQL硬编码。

这是旧式代码,我不相信人们再像这样编码了(我们现在使用CSS)

您可能正在寻找一些即将被重写或废弃的遗留代码,这是旧式代码,我不相信人们再像这样编写代码了(我们现在使用CSS)

在SQL性能方面,您可能正在寻找一些即将被重写或放弃的遗留内容,如果您只返回几行(或从外观上看是一行),这将产生最小的影响,因为语句的WHERE部分是在案例之前计算的(案例仅在与WHERE匹配的行上执行)


从最佳实践的角度来看,显示信息实际上不应该在SQL中确定。可能会返回一个主题类型,但肯定不会返回谨慎的样式信息。

就SQL性能而言,如果只返回几行(或者从外观上看是一行),这将产生最小的影响,因为语句的WHERE部分是在case之前计算的(case仅在与WHERE匹配的行上执行)


从最佳实践的角度来看,显示信息实际上不应该在SQL中确定。可能会返回主题类型,但肯定不会返回谨慎的样式信息。

100%同意重构,将显示决策交给表示层(或尽可能接近表示层)

案例。。。SQL中的END
仍然有其用途,不过,例如,我想计算所有国内客户订单总值的百分比。我瘦了
SELECT
  SUM(CASE domestic WHEN 'Y' THEN order_value ELSE 0 END) / SUM(order_value) AS pctg
FROM orders