案例陈述与编码if陈述

时间:2010-03-11 22:32:55

标签: sql asp-classic case-statement

什么更有效 - 使用sql中的case语句处理或使用代码中的if语句处理相同的数据。我问,因为我的同事有一个包含许多案例陈述的巨大查询。我建议她通过编写案例陈述来减轻数据库的压力。我发现它更有效......但为什么呢?

5 个答案:

答案 0 :(得分:24)

这里有一个更基本的问题:这些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功能。

首先考虑逻辑实际所属的位置,根据它想要实现的目标。如果您实际注意到重要的性能问题,那么性能问题应该只进入讨论。

答案 1 :(得分:6)

CASE语句是首选,因为:

  • SQL:它们是ANSI标准,使其可以移植到其他数据库而无需更改
  • 他们支持“短路”

答案 2 :(得分:2)

根据我的经验,我们的数据库服务器比我们的应用程序服务器大很多,并且通常闲置在30%以下。让数据库管理数据,然后让客户端遍历resultSet。最好让数据库只返回您需要的数据(如果您可以预先确定)。

答案 3 :(得分:1)

您应该查询(过滤和排序)数据库中的数据,并将演示文稿留给表示层。这有两个主要原因:

  • 数据库用于过滤和排序数据
  • 您希望根据需要从数据库中通过线路获取最少量的数据

答案 4 :(得分:0)

正如我所读到的,这里的基本问题是CAS在CAS中是否优于IF。答案还取决于您的条件的深度。在这里找到了一篇好文章。可能对某人有用。 http://www.4guysfromrolla.com/webtech/102704-1.shtml