2011-01-08 151 views
0

我试图改进以下CASE语句来计算差异只有一次。我这样做是为了避免负数:简化CASE当SQL语句

SELECT (CASE WHEN ((SELECT 100 - (SELECT COUNT(CustomerId) FROM Customers)) > 0) 
     THEN  (SELECT 100 - (SELECT COUNT(CustomerId) FROM Customers)) 
     ELSE  (0) 
     END) 

这不仅看起来愚蠢,但也不是线程安全的。我尝试了以下,但我收到一条错误消息“无效的列名'差异'。”

SELECT (CASE WHEN ((SELECT 100 - (SELECT COUNT(CustomerId) FROM Customers) as diff) > 0) 
     THEN (diff) 
     ELSE (0) 
     END) 

这怎么可以简化?是否有一个已经完成这项工作的内置SQL函数?

编辑:对不起,忘记提及select语句是在视图声明内,所以我不能声明变量。

回答

2

如果我按照你的逻辑正确的,这应该这样做:

SELECT COALESCE ((SELECT 100 - COUNT(CustomerID) 
FROM Customers 
HAVING COUNT(CustomerID) < 100), 0) 

更优美。

如果有一个基于行的MAX()函数,我们也可以使用它。当然你可以很容易地写一个。

2
DECLARE @diff int 
SELECT @diff = 100 - COUNT(*) FROM Customers 

SELECT CASE WHEN @diff > 0 THEN diff   
      ELSE 0   
     END as Diff 
+0

只是因为,我会使用SET而不是SELECT在第三条语句,使之清楚,你不打表第二次。 (今天战斗交易...) – 2011-01-08 00:32:20

+0

@Philip凯利:没有更多的上下文,它不知道最后选择是否返回结果给调用者... – 2011-01-08 00:36:05

1

您可以使用变量来启动查询的结果,因此您不必执行两次。例如:

DECLARE @CustomerCount INT 
SELECT @CustomerCount = COUNT(CustomerId) FROM Customers 
SELECT CASE WHEN (100 - @CustomerCount > 0) 
    THEN 100 - @CustomerCount 
    ELSE (0) 
    END 
1

你是对的,你只想计算一次,你想这样做,所以它清楚地显示出你的逻辑是什么。

SELECT CASE WHEN cnt > 100 THEN 0 
     ELSE 100 - cnt END AS diff 
FROM (SELECT COUNT(1) AS cnt 
     FROM Customers) AS CustomerCnt