【问题标题】:SQLite is the CASE statement expensive?SQLite 是 CASE 语句昂贵吗?
【发布时间】:2010-04-01 21:27:32
【问题描述】:

我想知道是否不建议在 SQLite(或其他 SQL 引擎)中使用 CASE 语句来替换数据。例如,假设我有一个查询。

SELECT Users, 
                CASE WHEN Active = 0 THEN 'Inactive'
                        WHEN Active = 1 THEN 'Active'
                        WHEN Active = 2 THEN 'Processing'
                        ELSE 'ERROR' END AS Active
FROM UsersTable;

何时创建引用表并执行 JOIN 更好。在这种情况下,我将使用 ActiveID、ActiveDescription 创建一个表“ActiveStatesTable”并执行 JOIN。

【问题讨论】:

    标签: sql mysql sqlite


    【解决方案1】:

    CASE 语句是首选语法:

    • 它是 ANSI (92?),因此它支持 MySQL、Oracle、SQL Server、Postgres...与数据库供应商特定的 IF 语法不同
    • 它支持短路 - 一旦标准匹配,就不会执行其余的评估

    【讨论】:

    • 是否应该考虑 CASE 语句的大小?如果表格中有“描述 ID”列,并且有 100 条描述要映射怎么办?
    【解决方案2】:

    做单独的表和JOIN绝对是编写这段代码的更简洁的方法。例如,如果您想编写另一个具有相同映射的查询,会发生什么?您必须将 CASE 语句复制到新查询中,并且复制重复是不好的。如果您需要添加新的 Active 状态会怎样?

    就性能而言,JOIN 和 CASE 都应该相当便宜。由于评估短路和少数情况,CASE 的性能可能稍高一些,但在我看来,JOIN 是更清洁、更灵活、更符合 SQL 的解决方案。

    【讨论】:

    • 这是真的,但是维护 CASE 不会太难,因为我可以创建一个包含 CASE 的 VIEW,然后维护 VIEW。
    【解决方案3】:

    CASE 应该便宜得多,因为它不涉及任何 I/O,但对于小型表,JOIN 也没有那么昂贵(但要测试一下)。

    问题是您是否需要在多个查询中维护此 CASE 以及是否需要在其上建立任何引用完整性。

    【讨论】:

    • 这是真的,但是维护 CASE 不会太难,因为我可以创建一个包含 CASE 的 VIEW,然后维护 VIEW。
    • 对于少数情况和例外情况可能很容易,但仍应考虑。忽略完整性,在视图中维护它与在表中维护它是不同的(您不能根据查询更新翻译)。
    • 这是有道理的。我将添加一个表格并执行一些基准测试。完成后我会发布结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多