Case语句与编码的if语句对比。

24

在处理相同数据时,使用SQL中的CASE语句还是在代码中使用if语句更有效率?我问这个问题是因为我的同事有一个包含多个CASE语句的巨大查询。我建议她通过编写代码来减轻数据库的压力。我发现这样做更有效率...但是为什么呢?


1
这个太笼统了。通常人们会建议你在数据库中处理数据查询,并记住,试图在代码中维护数据库模式(组/联合/去重)可能会遇到很多麻烦,因为这就是数据库的用途... - Adriaan Stander
2
在我看来,你应该更针对数据库开发人员来提出这个问题,单独的SQL标签并不足够,你使用的是哪种SQL数据库? - AnthonyWJones
4个回答

44

这里其实有一个更基本的问题:这些 CASE 语句到底是做什么用的?

先不要考虑性能。如果 CASE 只是用于转换查询结果的最终输出,而且实际上可以通过在 ASP 中使用 ifselect case 来替换相同的功能,那么这可能意味着数据库查询/过程正在尝试完成应由 UI 负责的工作,比如格式化。分离关注点问题比任何可能的性能问题都更为严重。

如果你有这样一个查询:

SELECT InvoiceID, InvoiceDate,
    CASE WHEN PaidStatus = 0 THEN 'Unpaid' ELSE 'Paid' END
FROM ...

这太荒谬了,因为UI或者任何层负责将数据映射到领域的层应该知道如何将数据库中的状态转换为对应的描述。在查询本身中包含这个逻辑是没有意义的。

另一方面,如果CASE构造是查询的重要部分,例如:

SELECT
    SUM(CASE WHEN PaidStatus = 0 THEN Amount ELSE 0 END) AS TotalUnpaid,
    SUM(CASE WHEN PaidStatus = 1 THEN Amount ELSE 0 END) AS TotalPaid
FROM ...

不要试图将这种逻辑移到UI层,因为数据库在这方面更加出色。而且CASE语句在语义上是查询的一部分(“计算x的总付款和未付款金额”),它并没有替代任何UI功能。

首先要考虑这个逻辑根据其意图实际属于哪里。只有在您真正发现显著的性能问题时,才应该考虑性能问题。


11
虽然这是一个非常好的且真实的回答,但我感觉它从未真正回答问题。虽然所有这些都更重要,但它在UI讨论上离题了,并绕过了问题。而且你说“......注意到了显着的性能问题”,除了运行基准测试和测试之外,向那些已经知道答案的人询问“哪个更有效率”可能是最好的方法。 - Sean_A91

11

CASE语句是首选的,因为:

  • SQL: 它们符合ANSI标准,可以在其他数据库中轻松移植而不需要修改
  • 它们支持“短路评估”

2

根据我的经验,我们的数据库服务器比应用服务器要大得多,并且通常处于30%以下的空闲状态。让数据库管理数据,然后让客户端通过resultSet迭代。最好的实践是让数据库只返回你需要的数据(如果你可以提前确定这一点)。


1

你应该在数据库中查询(过滤和排序)数据,并将演示留给演示层。这有两个关键原因:

  • 数据库是用来过滤和排序数据的
  • 您希望尽可能少地从数据库中拉取数据

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接