代码之家  ›  专栏  ›  技术社区  ›  Nelson Rothermel

条件选择查询

  •  3
  • Nelson Rothermel  · 技术社区  · 14 年前

    我有一个包含多个语句和 UNION ALL . 我正在做这样的事情:

    DECLARE @condition BIT;
    SET @condition = 0;
    
    SELECT * FROM table1
    WHERE @condition = 1;
    
    UNION ALL
    
    SELECT * FROM table2
    

    在这种情况下,表1不会返回任何结果。但是,该查询很复杂,有许多连接(例如 FullTextTable )执行计划的估计显示出很高的成本,但实际的行数和执行时间似乎显示出不同的成本。这是筛选整个查询的最有效方法,还是有更好的方法?如果可能的话,我不希望第一个select中的任何内容运行。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Community CDub    8 年前

    解决这个问题的最佳方法是使用动态SQL。Dforck的解决方案的问题是,它可能导致参数嗅探。为了给出一个大致的想法,您的查询可能如下所示

    declare@query varchar(max);

    如果(@condition=0) set@query='从表1中选择* 联合所有

    设置@query=@query+'从表2中选择*

    sp_executesql@查询

    这只是一个简化的例子,但是在实际的实现中,您将参数化动态查询,这将解决参数嗅探的问题。这个问题有一个很好的解释 Parameter Sniffing (or Spoofing) in SQL Server

        2
  •  2
  •   Jeff Hornby    14 年前

    我可以想象,最终的SQL查询以及依赖于预计算值的所有联合和条件会变得相当复杂。如果您有兴趣降低查询的复杂性(不是为了机器,而是为了维护目的),我会将单个查询移动到视图或表值函数中,以将该逻辑移动到其他地方。然后你可以使用 if @condition = 1 其他地方建议的语法。

        3
  •  1
  •   DForck42    14 年前

    我认为你最好这样做:

    if (@condition=1)
    begin
    
    select * from table1
    union all
    select * from table2
    
    end
    else
    begin
    
    select * from table2
    
    end