在查询中使用Case IF语句

时间:2014-12-02 20:45:09

标签: sql sql-server-2008 if-statement

在查询中使用Case IF语句(SQL 2008)

我有服务器,每个服务器有3个实例。我正在执行一个查询以在所有这些上运行。查询的一部分将过滤每个服务器的ID,即server1的123。

select COUNT(*) from Department Dep  
where Dep.LocationID in   
(1,2,3, -- Server1  
4,5,6, -- Server2  
7,8,9 --Server3  
)

我可以按照上面的方式过滤所有ID并获得结果。由于表格非常大(2行miilon行),最好只过滤表格中的whats,即服务器1的123。虽然完成所需的时间并没有多大差别。

我能做到这一点

if @@SERVERNAME ='Server1'  
  Begin  
  select COUNT(*) from Department Dep  
  where dep.LocationID in   
  (1,2,3)  
  End  

if @@SERVERNAME ='Server2'  
  Begin  
  select COUNT(*) from Department Dep  
   where dep.LocationID in   
  (4,5,6)  
  End  


if @@SERVERNAME ='Server3'  
  Begin  
  select COUNT(*) from Department Dep  
 where dep.LocationID in    
  (7,8,9)  
  End  

因此,如果我在server2上运行上面的查询,我只会过滤(4,5,6)

我想将此结果加入到另一个查询中,因此寻找更好的方法来实现它。

由于

3 个答案:

答案 0 :(得分:1)

您可以在WHERE子句中使用三个条件执行此操作:

  select COUNT(*) from Employee emp  
  where 
  (@@SERVERNAME = 'Server1' AND emp.LocationID in (1,2,3))
    OR 
  (@@SERVERNAME = 'Server2' AND emp.LocationID in (4,5,6))
    OR 
  (@@SERVERNAME = 'Server3' AND emp.LocationID in (7,8,9))

答案 1 :(得分:1)

执行此操作的理想方法是将服务器名称(或相关密钥)放在locations查找表中。然后你可以很简单地做到这一点:

select COUNT(*) from Employee emp  
where emp.LocationID in   
(select locationID from locations where server = @@SERVERNAME)

这也允许您在不更改代码的情况下添加其他实例。

答案 2 :(得分:0)

如果您正在努力坚持下去'在所有三个查询中都有一个结果集,您可以将输出存储在临时表(或表变量)中,然后在最终查询中使用该对象。

示例:

CREATE TABLE #ServerOutput (ServerName VARCHAR(20), TotalRecords INT)

IF @@SERVERNAME = 'Server1'
  BEGIN
    INSERT INTO #ServerOutput (ServerName, TotalRecords)
    SELECT @@SERVERNAME, COUNT(*) AS TotalRecords
    FROM Employee emp
    WHERE emp.Location IN (1,2,3)
  END

SELECT * FROM #ServerOutput