5

我有一种情况,我已经用两种不同的方式解决了,但想知道人们对这些选项的看法,以及他们是否有其他选择......

系统正在处理数据的“间隔”。

  • 所有数据都分配给一个“区间”
  • 间隔由 Fact 表中的“interval_start”DATETIME 表示
  • 维度表保存“间隔”的持续时间(不同实体可能不同)
  • 维度表中还有一个“模式”标志


SQL 查询中需要以下规则...

模式0
如果记录条目在事实表中,则可以对其进行处理。
(无限制。)

模式 1
只有在“interval_start”是过去的情况下,记录才对处理有效。(已经开始但不一定结束的时间间隔。)

模式2
只有整个“间隔”都在过去时,记录才对处理有效。(已完成的时间间隔。)


为此创建的第一个 WHERE 子句如下...

WHERE
    getDate() >=
        CASE [table].mode
            WHEN 0 THEN 0
            WHEN 1 THEN [log].interval_start
            WHEN 2 THEN [log].interval_start + [table].interval_period
            ELSE        NULL
        END


有人担心这会使索引无法优化子句。另一种方法是使用多个 AND/OR 条件。

WHERE
   ([table].mode = 0 AND getDate() >= 0)
OR ([table].mode = 1 AND getDate() >= [log].interval_start)
OR ([table].mode = 2 AND getDate() >= [log].interval_start + [table].interval_period)


显然,哪个表现最好将取决于数据和索引等。但是对于我目前描述为“条件条件”的内容,是否有人有任何选择或替代方案?:)

干杯,马特。

4

2 回答 2

5

怎么样:

WHERE
     interval_start <= CASE mode
                         WHEN 0 THEN '9999-12-31'
                         WHEN 1 THEN GETDATE()
                         WHEN 2 THEN GETDATE() - interval_period
                       END
于 2009-04-21T11:46:14.520 回答
4

另一种选择是运行三个单独的查询并将它们联合起来。根据您的索引和表结构,这可能会导致比将 WHERE 子句中的子句或使用 CASE 语句的子句 OR-ing 更有效的 SQL,尽管它纯粹是在玩优化器。

我会测试所有三种方法并选择最适合您的一种。

于 2009-04-21T11:47:19.010 回答