Обычно, чтобы выполнить объединение на основе регистра, вы преобразуете псевдо
select 1 AS A
IF @b!=-1 then
union all
select 2 as B
END IF
в
select 1 AS A
union all
select 2 as B WHERE @b!=-1 -- the condition covers the entire select
-- because it is a variable test, SQL Server does it first and
-- aborts the entire part of the union if not true
Для вашего запроса, который становится
SELECT
[ID_ADRESS],[ID_ENT],[VOI_ADRESS],[NUM_ADRESS],[BTE_ADRESS]
,[CP_ADRESS],[VIL_ADRESS]
FROM [ADRESSES]
WHERE
(
(VIL_ADRESS != 'NC' AND VIL_ADRESS != '--')
AND
(@OnlyLinked = 0 OR ID_ENT is not null)
)
UNION
SELECT
[ID_ADRESS],[ID_ENT],[VOI_ADRESS],[NUM_ADRESS],[BTE_ADRESS]
,[CP_ADRESS],[VIL_ADRESS]
FROM [ADRESSES]
WHERE
ID_ADRESS = @ObligedId
AND (@ObligedId != -1)
ОднакоТак как в этом конкретном запросе данные из одной и той же таблицы просто разные фильтры, вы бы ИЛИ фильтры вместо этого. Примечание: , если вы использовали UNION ALL, его нельзя уменьшить таким образом из-за возможных дубликатов, которые сохраняет UNION ALL.Для UNION (который в любом случае удаляет дубликаты) сокращение OR работает просто отлично
SELECT
[ID_ADRESS],[ID_ENT],[VOI_ADRESS],[NUM_ADRESS],[BTE_ADRESS]
,[CP_ADRESS],[VIL_ADRESS]
FROM [ADRESSES]
WHERE
(
(VIL_ADRESS != 'NC' AND VIL_ADRESS != '--')
AND
(@OnlyLinked = 0 OR ID_ENT is not null)
)
OR
(
ID_ADRESS = @ObligedId
AND (@ObligedId != -1) -- include this
)