A case
выражение возвращает только одно значение.Таким образом, вы не можете делать то, что хотите.
Вы можете упростить логику, но немного по-другому.Вероятно, лучший подход - использовать cross apply
.Обратите внимание, что это входит в предложение from
, поскольку выражения в select
могут возвращать только скалярные значения.Итак, вам нужно выбрать нужные столбцы в select:
select v.oldcode, . . .
from . . . cross apply
(select v.*
from (values ('S', [sOld].code, [sOld].system, [sNew].code, [sNew].system),
('R', [rOld].code, [rOld].system, [rNew].code, [rNew].system)
) v(item, oldcode, oldsystem, newcode, newsystem)
where v.item = [AEC].item
) v
Это соответствует тем же потребностям, что и вы, с одним выражением case
.Примечательно, что логика сопоставления появляется только один раз.Преимущество этой версии заключается в том, что отдельные поля могут использоваться в нескольких выражениях в select
.