SQL语句中的条件运算符

Mar*_*arc 7 sql t-sql sql-server sql-server-2005

我希望我可以在我的where子句中执行SQl Server 2005(我知道它无效)中的以下内容.有时@teamID(传入存储过程)将是现有teamID的值,否则它将始终为零,我想要Team表中的所有行.

我使用Case进行了研究,运算符需要在整个语句之前或之后出现,这使得我无法根据@teamid的值使用不同的运算符.除了复制我的select语句之外的任何建议.

    declare @teamid int
    set @teamid = 0

    Select Team.teamID From Team
      case @teamid
         when 0 then 
            WHERE Team.teamID > 0
         else
            WHERE Team.teamID = @teamid
      end 
Run Code Online (Sandbox Code Playgroud)

And*_*mar 18

没有案例你可以这样做:

SELECT  Team.teamID 
FROM    Team
WHERE   (@teamid = 0 AND Team.teamID > 0)
        OR (@teamid <> 0 AND Team.teamID = @teamid)
Run Code Online (Sandbox Code Playgroud)


OMG*_*ies 5

不使用动态SQL,性能最佳的选项是:

IF @teamid = 0
  BEGIN

    SELECT t.teamid
      FROM TEAM t
     WHERE t.teamid > 0

  END
ELSE
  BEGIN

    SELECT t.teamid
      FROM TEAM t
     WHERE t.teamid = @teamid

  END
Run Code Online (Sandbox Code Playgroud)

使用动态SQL:

DECLARE @SQL NVARCHAR(4000)
   SET @SQL = 'SELECT t.teamid
                 FROM TEAM t
                WHERE 1 = 1 '

   SET @SQL = @SQL + CASE @teamid
                       WHEN 0 THEN ' AND t.teamid > 0 '
                       ELSE ' AND t.teamid = @teamid '
                     END

BEGIN

  EXEC sp_EXECUTESQL @SQL N'@teamid INT', @teamid

END
Run Code Online (Sandbox Code Playgroud)

请注意sp_EXECUTESQL缓存查询计划,而EXEC则不会.阅读本文:http://www.sommarskog.se/dynamic_sql.html