Я не думаю, что @JBrooks правильно перевел ваше заявление (и, что неприятно, может привести к ложным срабатываниям).
Я думаю, что CASE
эквивалент выглядит следующим образом:
WHERE 1 = CASE
WHEN @Status <> 1
THEN CASE
WHEN (t3.Id = @SID AND sh.StatusId = 3 AND k.StatusId = 1)
THEN 1
END
ELSE CASE
WHEN t2.Id = @SID AND t2.StatusID = 12
THEN 1
END
END
Однако я согласен с тем, что такую конструкцию трудно читать и отлаживать, и согласен с тем, что она может быть преобразована.Однако, хотя «предпочтительный путь» @ JBrooks представляет собой дизъюнктивную нормальную форму (то есть (predicate_1 OR predicate_2)
, которая требует скобок), я предпочитаю конъюнктивную нормальную форму (то есть preidcate_1 AND preidcate_2
), например,
WHERE
( p.Status = 1 OR ( t3.Id = p.SID AND sh.StatusId = 3 AND k.StatusId = 1 ) )
AND
( p.Status <> 1 OR ( t2.Id = p.SID AND t2.StatusID = 12 ) )