SQL Server,根据参数在WHERE语句中使用IF语句从两个TABLE中进行选择

时间:2010-02-16 12:44:54

标签: sql-server tsql sql-server-2000 where-clause

如何在SQL Server中执行以下操作

DECLARE @Local nvarchar(20)
SET @Local = 'True'

    SELECT * FROM My_Table
    WHERE my_ID IN

    (IF @Local = 'True' 
         SELECT AllIDs FROM ATable
    ELSE 
         SELECT TeamIDs FROM TeamTable
    )

4 个答案:

答案 0 :(得分:2)

去找工会: -

SELECT * FROM My_Table WHERE my_id IN
(
  SELECT AllIDs AS MyIDs FROM ATable WHERE @Local = 'True'
  UNION
  SELECT TeamIDs AS MyIDs FROM TeamTable WHERE @Local <> 'True'
)

答案 1 :(得分:1)

SELECT  *
FROM    mytable
WHERE   my_id IN
        (
        SELECT  allids
        FROM    atable
        WHERE   @Local = 'True'
        )
UNION ALL
SELECT  *
FROM    mytable
WHERE   my_id IN
        (
        SELECT  teamids
        FROM    teamtable
        WHERE   COALESCE(@Local, '') <> 'True'
        )

优化器将优化掉错误的查询,因此性能将与相应(剩余)查询的性能相同。

答案 2 :(得分:1)

DECLARE @Local nvarchar(20)
SET @Local = 'True'

SELECT * FROM My_Table
WHERE my_ID IN ( 
     SELECT AllIDs FROM ATable
     WHERE @Local = 'True'
     UNION ALL 
     SELECT TeamIDs FROM TeamTable
     WHERE @Local != 'True'
)

答案 3 :(得分:1)

不要这样做!

(至少如果你关心表现的话,不会这样)

肯定有一种方法可以做到这一点,但你确实不应该 - 原因是(一般来说)单个语句只有1个执行计划,但是你基本上有2个(可能)非常不同的要求:

SELECT * FROM My_Table
WHERE my_ID IN (SELECT AllIDs FROM ATable)

SELECT * FROM My_Table
WHERE my_ID IN (SELECT AllIDs FROM TeamTable)

组合这两个查询意味着SQL服务器只能使用1个exectuion计划同时尝试和优化这两个查询。根据两个表的差异,这可能会正常工作,或者可能会出现可怕的错误。

例如,如果ATable只包含1行,而TeamTable包含My_Table中的所有ID,则SQL Server必须在执行查找之间选择/妥协(最好使用ATable)和表扫描(最好是使用TeamTable) - 无论它最终做什么,SQL服务器都不可能使用最佳执行计划执行两个查询(除非两个执行计划恰好是相同)。

您应该使用2个语句:

DECLARE @Local nvarchar(20)
SET @Local = 'True'

IF @Local = 'True' 
    SELECT * FROM My_Table
    WHERE my_ID IN (SELECT AllIDs FROM ATable)
ELSE
    SELECT * FROM My_Table
    WHERE my_ID IN (SELECT AllIDs FROM TeamTable)

事实上,在这种特殊情况下,您可能最好选择ID列表到临时表中。