Как избежать дубликатов в заявлении IIF - PullRequest
0 голосов
/ 14 октября 2019

Проблема заключается в следующем:

У меня есть эта таблица NUMBERS, где у меня есть два столбца чисел:

+----------+----------+
| Number 1 | Number 2 |
+----------+----------+
|       12 |        3 |
|       20 |        7 |
|       17 |        5 |
+----------+----------+

На основе этой таблицы я выполняю инструкцию SQL SELECT, где я хочудля отображения суммы обоих чисел и того, является ли сумма больше 20 (должен отображаться Interim_Result, а также Result)

+----------+----------+----------------+----------+
| Number_1 | Number_2 | Interim_Result | Result   |
+----------+----------+----------------+----------+
|       12 |        3 |             15 | under 20 |
|       20 |        7 |             27 | over 20  |
|       17 |        5 |             22 | over 20  |
+----------+----------+----------------+----------+

Я написал бы SQL-выражение наподобие этого:

SELECT 
Number_1,
Number_2,
Number_1 + Number_2 AS Interim_Result,
iif(Number_1 + Number_2 > 20, over 20, under 20) AS Result
FROM 
NUMBERS

Это утверждение работает, но у меня есть дубликат кода Number_1 + Number_2
есть ли способ избежать дублирования кода в iif и просто написать:

SELECT 
Number_1,
Number_2,
Number_1 + Number_2 AS Interim_Result,
iif(Interim_Result > 20, over 20, under 20) AS Result
FROM 
NUMBERS

Я к вашему сведениюиспользуя SQL Server

Ответы [ 2 ]

3 голосов
/ 14 октября 2019

Вы можете часто использовать оператор APPLY для сокращения кода и уменьшения повторений.

SELECT 
Number_1,
Number_2,
I.Interim_Result AS Interim_Result,
iif(I.Interim_Result > 20, 'over 20', 'under 20') AS Result
FROM 
NUMBERS AS N
CROSS APPLY (SELECT N.Number_1 + N.Number_2 AS Interim_Result) AS I
2 голосов
/ 14 октября 2019

Этого можно достичь, используя подзапрос и, возможно, используя CASE вместо IIF:

SELECT Number_1,
       Number_2,
       Interim_Result,
       CASE
         WHEN Interim_result > 20 THEN 'Over 20'
         ELSE 'Under 20'
       END AS Result
  FROM (
       SELECT Number_1,
              Number_2,
              Number_1 + Number_2 AS Interim_Result
         FROM NUMBERS
       ) a

Примечание: код не проверен, но должен поставить вас на правильный путь

Изменить ссылку на использование CASE

Как указал @ clem995, вы можете с радостью использовать IIF вместо CASE:

SELECT Number_1,
       Number_2,
       Interim_Result,
       IIF(Interim_result > 20, 'Over 20', 'Under 20') AS Result
  FROM (
       SELECT Number_1,
              Number_2,
              Number_1 + Number_2 AS Interim_Result
         FROM NUMBERS
       ) a

Мои личные предпочтенияиспользовать CASE, поскольку я считаю его более разборчивым, и он работает на нескольких языках SQL, но IIF полностью допустим в этом сценарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...