Если у вас смешанные условия AND
и OR
, то лучше использовать круглые скобки ( )
, чтобы четко определить предполагаемые условия.
Также избегайте применения функции к столбцу, так как это запретит использование индекса для столбца. Если EffectiveDate не содержит времени, вы можете просто использовать равные emp.EffectiveDate = CAST(GETDATE() AS DATE)
, иначе вы должны использовать >= today
и < tomorrow
DECLARE @PCStatus as varchar(50);
SELECT *
FROM Employee emp
WHERE
(
emp.PCStatus = @PCStatus
)
OR
(
@PCStatus = ''
)
OR
(
@PCStatus LIKE '%ON-HOLD%'
AND emp.EffectiveDate >= CAST(GETDATE() AS DATE)
AND emp.EffectiveDate < CAST(DATEADD(DAY, 1, GETDATE()) AS DATE)
)
РЕДАКТИРОВАТЬ: изменить на LIKE '%ON-HOLD%'
РЕДАКТИРОВАТЬ 2: @PCStatus является CSV
здесь запрос использует STRING_SPLIT()
, если вы используете более раннюю версию SQL Server, используйте DelimitedSplit8K
, который я разместил в комментариях
DECLARE @PCStatus as varchar(50) = 'ACTIVE,ON-HOLD';
SELECT *
FROM Employee emp
WHERE
(
@PCStatus = ''
OR EXISTS
(
select *
from STRING_SPLIT(@PCStatus, ',') x
where x.value = emp.PCStatus
)
)
AND
(
emp.PCStatus <> 'ON-HOLD'
OR emp.EffectiveDate <= CAST(GETDATE() AS DATE)
)