Упрощение CASE WHEN оператора SQL - PullRequest
0 голосов
/ 08 января 2011

Я пытаюсь улучшить следующий оператор CASE, чтобы вычислить разницу только один раз.Я делаю это, чтобы избежать отрицательных чисел:

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

Это не только выглядит глупо, но и не является поточно-ориентированным.Я попробовал следующее, но получаю сообщение об ошибке «Недопустимое имя столбца diff».

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

Как это можно упростить?Есть ли встроенная функция SQL, которая уже выполняет эту работу?

EDIT: Извините, забыл упомянуть, что оператор select находится внутри объявления представления, поэтому я не могу объявлять переменные.

Ответы [ 4 ]

2 голосов
/ 08 января 2011

Если я правильно следую вашей логике, это должно быть сделано:

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

Слегка более изящно.

Если бы существовала функция MAX (), основанная на строках, мы могли бы использовать это тоже. Конечно, вы могли бы написать достаточно легко.

2 голосов
/ 08 января 2011
DECLARE @diff int
SELECT @diff = 100 - COUNT(*) FROM Customers

SELECT CASE WHEN @diff > 0 THEN diff           
            ELSE 0           
       END as Diff
1 голос
/ 08 января 2011

Вы правы, вы хотите считать только один раз, и вы хотите сделать это, чтобы оно ясно показывало вашу логику.

SELECT CASE WHEN cnt > 100 THEN 0
       ELSE 100 - cnt END AS diff
FROM (SELECT COUNT(1) AS cnt
      FROM Customers) AS CustomerCnt
1 голос
/ 08 января 2011

Вы можете использовать переменную для запуска результата запроса, чтобы вам не приходилось выполнять его дважды.Например:

DECLARE @CustomerCount INT
SELECT @CustomerCount = COUNT(CustomerId) FROM Customers
SELECT CASE WHEN (100 - @CustomerCount > 0) 
     THEN 100 - @CustomerCount
     ELSE (0) 
     END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...