代码之家  ›  专栏  ›  技术社区  ›  MatBailie

WHERE子句中的“条件条件”(应用哪种条件取决于“模式”标志)

  •  5
  • MatBailie  · 技术社区  · 17 年前

    我用两种不同的方法解决了一个问题,但我想知道人们对这些选择有什么想法,以及他们是否还有其他选择。。。

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

    • 间隔由事实表中的“interval\u start”日期时间表示
    • Dimension表包含“间隔”的持续时间(对于不同的实体可以不同)
    • 维度表中还有一个“模式”标志


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


    如果事实表中有记录条目,则可以对其进行处理。
    (没有限制。)

    模式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
    


    有人担心这会妨碍索引优化该子句。另一种选择是使用多个和/或条件。

    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)
    


    干杯

    2 回复  |  直到 17 年前
        1
  •  5
  •   Tom H zenazn    17 年前

    怎么样:

    WHERE
         interval_start <= CASE mode
                             WHEN 0 THEN '9999-12-31'
                             WHEN 1 THEN GETDATE()
                             WHEN 2 THEN GETDATE() - interval_period
                           END
    
        2
  •  4
  •   mwigdahl    17 年前

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