在查询中使用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)
我想将此结果加入到另一个查询中,因此寻找更好的方法来实现它。
由于
答案 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