案例陈述与编码if陈述

Eri*_*ric 14 sql case-statement asp-classic

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

Aar*_*ght 28

有一个更基本的问题,这里没有被问到:这些CASE陈述实际上在做什么?

忘记表演一分钟.如果CASE仅用于转换查询的最终输出,并且实际上可以用ASP ifselect caseASP 替换相同的功能,则可能意味着数据库查询/过程正在尝试执行UI应该负责的事情用于格式化等.关注点分离问题比任何可能的性能问题都严重得多.

如果您有这样的查询:

SELECT InvoiceID, InvoiceDate,
    CASE WHEN PaidStatus = 0 THEN 'Unpaid' ELSE 'Paid' END
FROM ...
Run Code Online (Sandbox Code Playgroud)

这很愚蠢,因为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 ...
Run Code Online (Sandbox Code Playgroud)

甚至不要尝试将这种逻辑移动到UI,因为数据库好得多.并且它在CASE语义上是查询的一部分("计算x的有偿和无偿总金额"),它不会接管任何UI功能.

首先要担心逻辑实际所属的位置,这取决于它想要实现的目标.如果您实际注意到重大性能问题,性能问题应该只进入讨论.

  • 虽然这是一个伟大而非常真实的回应,但我觉得它实际上并没有回答这个问题.像所有这一切都更为重要,但它有点与UI谈话相关,围绕问题.你说"......注意到重大的性能问题",缺乏运行基准测试和测试,从那些已经知道可能是最佳方式的人那里问"哪个更有效". (3认同)

OMG*_*ies 6

CASE 语句是首选,因为:

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