Как сохранить результат выражения CASE во (временной / не) переменной и использовать его для одновременного вычисления внутри одного и того же оператора SELECT - PullRequest
0 голосов
/ 21 апреля 2020

На другом языке программирования мы можем сделать это:

A = 5
B = A + 7

Но кто-нибудь знает, как сделать это в SQL, что-то вроде этого:

SELECT
    (CASE WHEN (CASE WHEN t.[Id] IS NULL THEN 0 ELSE 1 END) = 1 THEN a.[123]
        ELSE a.[432] END) AS 'Points',
     @'Points' + 5 AS 'FinalPoints'   ---Does any way to do this
FROM  DeliveryOrder AS do
LEFT JOIN Transaction AS t ON t.DOId = do.Id 
LEFT JOIN Amount AS a ON do.Id = a.Id

Я действительно ценю, если у кого-нибудь есть идеи, как это сделать

P / S: поскольку я могу использовать SubQuery для имитации этого, но в моем случае у каждого столбца есть много выражений CASE..WHEN, а внутри него тоже есть выражение Case, так что в конце концов когда все они объединены в один подзапрос, становится так ужасно читать: (

Ответы [ 3 ]

0 голосов
/ 21 апреля 2020

Использование подзапроса

SELECT Points, Points + 5 AS FinalPoints
FROM
(
  SELECT CASE WHEN (CASE WHEN T.Id IS NULL THEN 0 ELSE 1 END) = 1 THEN 5 ELSE 10 END Points
  FROM DeliveryOrder AS DO
  LEFT JOIN [Transaction] AS T ON DO.Id = T.DOId
) T

Вы можете получить вложенное выражение CASE и напрямую использовать

CASE WHEN T.Id IS NOT NULL THEN 5 ELSE 10 END Points
0 голосов
/ 21 апреля 2020

Другим способом можно использовать перекрестное применение,

SELECT
  p.Points
  ,p.Points+5 'FinalPoints' 
FROM  DeliveryOrder AS do
LEFT JOIN dbo.[Transaction] AS t ON t.DOId = do.Id 
cross apply (
select CASE WHEN T.Id IS NOT NULL THEN 5 ELSE 10 END  AS 'Points'
) p
0 голосов
/ 21 апреля 2020

Вы не можете делать именно то, что вы хотите. Псевдонимы, определенные в предложении select, не могут быть повторно использованы в том же предложении, поэтому вам нужно либо повторить выражение, либо использовать производную таблицу (подзапрос или cte).

Ваша вложенная case кажется излишней - Я думаю, что ваш код может быть упрощен как:

SELECT
    CASE WHEN t.[Id] IS NULL THEN 10 ELSE 5 END AS points,
    CASE WHEN t.[Id] IS NULL THEN 15 ELSE 10 END finalPoints
FROM  DeliveryOrder AS do
LEFT JOIN Transaction AS t ON t.DOId = do.Id 

Или используя подзапрос:

SELECT
    points,
    points + 5 finalPoints
FROM (
    SELECT CASE WHEN t.[Id] IS NULL THEN 10 ELSE 5 END AS points
    FROM  DeliveryOrder AS do
    LEFT JOIN Transaction AS t ON t.DOId = do.Id 
) t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...