Проверьте, существует ли определенное значение в переданном параметре в запросе (SQL SERVER) - PullRequest
0 голосов
/ 15 ноября 2018

Поэтому мне нужно определить, существует ли определенное значение в переданном параметре для выполнения определенного условия. Вот запрос ниже:

DECLARE @PCStatusas varchar(50);

SELECT * FROM 
Employee emp 
WHERE (emp.PCStatus IN (@PCStatus) OR @PCStatus = '') 
OR 

(«ON-HOLD» IN (@PCStatus)

AND CAST(emp.EffectiveDate AS DATE) <= CAST(GETDATE() AS DATE)))

так что мне нужно проверить, содержит ли отправленный параметр значение ON-HOLD для выполнения условия EffectiveDate, равного или меньшего, чем сегодня.

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Если у вас смешанные условия 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)
)
0 голосов
/ 15 ноября 2018

Итак, с помощью моего коллеги, мы создали функцию, которая разбивает CSV во временную таблицу, и там я могу просто проверить, есть ли определенное значение во временной таблице и вернуть для него логическое значение.Спасибо за помощь, ребята.

0 голосов
/ 15 ноября 2018

Вы можете сделать как (@PCStatus like '%ON-HOLD%')

DECLARE @PCStatusas varchar(50);

SELECT * FROM 
Employee emp 
WHERE (emp.PCStatus IN (@PCStatus) OR @PCStatus = '') 
OR 
(@PCStatus like '%ON-HOLD%')

AND CAST(emp.EffectiveDate AS DATE) <= CAST(GETDATE() AS DATE)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...