代码之家  ›  专栏  ›  技术社区  ›  Sam Schutte

SQL Server-查询短路?

  •  4
  • Sam Schutte  · 技术社区  · 16 年前

    SQL Server中的T-SQL查询是否支持短路?

    因此,我的查询与这两个匹配如下:

    为了加快速度,我想在前面添加一个OR,就像上面说的: 表1.ID=表2.ID

    7 回复  |  直到 16 年前
        1
  •  7
  •   George Mastros    16 年前

    可以将计算列添加到表中。然后,索引计算列并在联接中使用该列。

    前任:

    Alter Table Table1 Add PaddedId As Right('000000000000' + Id, 12)
    Create Index idx_WhateverIndexNameYouWant On Table1(PaddedId)
    

    那么你的问题是。。。

    select * from table1 where table1.PaddedID ='000000001234'
    

    这将使用刚刚创建的索引快速返回行。

        2
  •  7
  •   George Stocker NotMe    15 年前

    SQL Server确实如此 条件允许时短路。 How SQL Server short-circuits WHERE condition evaluation .

        3
  •  3
  •   Tom H zenazn    16 年前

    为了确保可以使用索引,还要避免使用LIKE。例如,最好有:

    WHERE
         T1.ID = CAST(T2.ID AS VARCHAR) OR
         T1.ID = RIGHT('0000000000' + CAST(T2.ID AS VARCHAR), 10)
    

    比:

    WHERE
         T1.ID LIKE '%' + CAST(T2.ID AS VARCHAR)
    

    正如Steven A.Lowe提到的,第二个查询也可能不准确。

    如果要使用T1中的所有行(换句话说,是一个到T2的左外部连接),那么最好使用:

    WHERE
         CAST(T1.ID AS INT) = T2.ID
    

    如果您不确定每个方法,请执行一些查询计划,看看哪种方法最有效。

    绝对最好的方法是按照其他人的建议,如果可能的话,将表的数据类型更改为匹配。即使你不能在这个项目到期之前完成它,也要把它放在你的“待办事项”清单上。

        4
  •  3
  •   Dennis C    16 年前

    怎么样

    table1WithZero.ID = REPLICATE('0', 12-len(table2.ID))+table2.ID
    

    在这种情况下,它应该能够使用表1上的索引

        5
  •  3
  •   Daniel Renshaw    15 年前

    正如Mladen Prajdic的anwer中的链接页面所解释的,以防它有用,case子句

        6
  •  1
  •   Stein G. Strindhaug    16 年前

    如果ID是纯数字的(如您的示例所示),我建议(如果可能的话)将该字段改为数字类型。如果数据库在使用中已准备就绪,则可能很难更改类型。

        7
  •  1
  •   Steven A. Lowe    16 年前

    将数据库修复为一致

    select * from table1 where table1.ID LIKE '%1234'
    

    如果无法清除数据,请编写一个用户定义函数(UDF)以去除前导零,例如。

    select * from table1 where dbo.udfStripLeadingZeros(table1.ID) = '1234'
    

    编辑:如果可能的话,Tom H关于转换为整数的建议是最好的。