SQL Server: использование результата операции дважды в select - PullRequest
0 голосов
/ 22 ноября 2018

Мне было интересно, как лучше всего сделать что-то вроде этого:

SELECT 
    num1 - num2 as 'Substraction'
    IIF(num1 - num2 > 0, 'TRUE', 'FALSE') AS 'num1IsBigger'
FROM
    numbers

Я не хочу повторять (num1 - num2) дважды, так как вы не можете сделать это:

SELECT 
    num1 - num2 as 'Substraction'
    IIF(Substraction > 0, 'TRUE', 'FALSE') AS 'num1IsBigger'
FROM
    numbers

Я могу придумать несколько способов ее решения, но ни один из них не кажется прямолинейным или «оптимальным», так как лучше всего это решить?

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Вы можете использовать общее табличное выражение

with cte as
(
SELECT 
    num1 - num2 as 'Substraction'
    FROM
    numbers
)
select IIF(Substraction > 0, 'TRUE', 'FALSE') AS 'num1IsBigger' from cte
0 голосов
/ 22 ноября 2018

Традиционный способ - это CTE или подзапрос, но мне нравится использовать боковые объединения (т. Е. Ключевое слово APPLY).Я написал бы это как:

SELECT v.Substraction,
       (CASE WHEN substraction > 0 THEN 'TRUE' ELSE 'FALSE' END) AS num1IsBigger
FROM numbers CROSS APPLY
     (VALUES (num1 - num2)) v(subtraction);

Примечания:

  • Я заменил функцию на заказ на IIF() со стандартным выражением CASE.Последнее не только стандартно, но и более гибко и доступно практически во всех базах данных.
  • Я удалил одинарные кавычки вокруг псевдонимов столбцов.Одинарные кавычки должны использоваться только для констант строки и даты, а имена столбцов не должны быть экранированными.
  • Боковые объединения являются очень мощными, и простой пример, подобный этому, - хороший способ познакомиться с ними.
0 голосов
/ 22 ноября 2018

Вы можете сначала вычислить его в подзапросе, а затем использовать его в select, например:

SELECT 
    Diff as 'Substraction'
    IIF(Diff > 0, 'TRUE', 'FALSE') AS 'num1IsBigger'
FROM
    (select num1,num2,num1-num2 Diff numbers) AS n
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...