#sql #sql-server #case #where #alias
#sql #sql-сервер #случай #где #псевдоним
Вопрос:
У меня есть следующий запрос, который выполняется нормально, когда Where не заполнен, но у меня возникают трудности с получением правильных ссылок для данных в where.
Код приведен ниже:
SELECT g.Id as Id,
g.Printed as Printed,
g.CreatedDate as CreatedDate ,
case when (
Select Count(Distinct custSubGA.CustomerId) from PickingAssignment_PickingAssignmentUserGroup custSubG
join PickingAssignment custSubGA on custSubGA.Id = custSubG.PickingAssignmentId
join Customer custSub2C on custSubGA.CustomerId = custSub2C.Id
where custSubG.PickingAssignmentUserGroupId = Max(g.Id)
) > 1
then 'Multiple'
else (
Select Max(custSub2C.Name) from PickingAssignment_PickingAssignmentUserGroup custSub2G
join PickingAssignment custSub2GA on custSub2G.PickingAssignmentId = custSub2GA.Id
join Customer custSub2C on custSub2GA.CustomerId = custSub2C.Id
where custSub2G.PickingAssignmentUserGroupId = Max(g.Id)
) end as CustomerName
from PickingAssignmentUserGroup g
where CustomerName like 'exet%'
Я также пытался использовать » где custSub2C.Name например, «exet%», и это тоже не сработало. Многосоставный идентификатор custSub2C.Name не мог быть связан — вот что я получаю от этого.
Это первый раз, когда я пытаюсь использовать операторы case в SQL, поэтому есть вероятность, что я делаю это очень неправильно.
Любая помощь была бы фантастической. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.
Ответ №1:
Вы не можете использовать псевдоним столбца в where
инструкции того же уровня. В большинстве баз данных вы бы просто использовали подзапрос:
select *
from (SELECT g.Id as Id, g.Printed as Printed, g.CreatedDate as CreatedDate ,
case when (Select Count(Distinct custSubGA.CustomerId)
from PickingAssignment_PickingAssignmentUserGroup custSubG join
PickingAssignment custSubGA
on custSubGA.Id = custSubG.PickingAssignmentId join
Customer custSub2C
on custSubGA.CustomerId = custSub2C.Id
where custSubG.PickingAssignmentUserGroupId = Max(g.Id)
) > 1
then 'Multiple'
else (Select Max(custSub2C.Name)
from PickingAssignment_PickingAssignmentUserGroup custSub2G join
PickingAssignment custSub2GA
on custSub2G.PickingAssignmentId = custSub2GA.Id join
Customer custSub2C
on custSub2GA.CustomerId = custSub2C.Id
where custSub2G.PickingAssignmentUserGroupId = Max(g.Id)
)
end as CustomerName
from PickingAssignmentUserGroup g
) t
where CustomerName like 'exet%'
Ответ №2:
Как уже указывал Гордон, псевдонимы столбцов разрешаются после WHERE
, но также возможно переместить подзапросы из в CASE
в FROM
и, поскольку единственным отличием является поле в SELECT
, объединить их.
SELECT g.Id as Id,
g.Printed as Printed,
g.CreatedDate as CreatedDate ,
CASE WHEN CM.CustomerCount > 1 THEN 'Multiple'
ELSE CM.Name
END as CustomerName
FROM PickingAssignmentUserGroup g
OUTER APPLY (
SELECT Max(custSub2C.Name) Name
, Count(Distinct custSubGA.CustomerId) CustomerCount
FROM PickingAssignment_PickingAssignmentUserGroup custSub2G
INNER JOIN PickingAssignment custSub2GA
ON custSub2G.PickingAssignmentId = custSub2GA.Id
INNER JOIN Customer custSub2C
ON custSub2GA.CustomerId = custSub2C.Id
WHERE custSub2G.PickingAssignmentUserGroupId = Max(g.Id)) CM
WHERE CM.Name like 'exet%' AND CM.CustomerCount = 1