检查查询中传递的参数中是否存在某个值(SQL SERVER)

时间:2018-11-15 05:08:44

标签: sql sql-server report conditional-statements

因此,我需要确定传递的参数中是否存在某个值才能执行某种条件。这是下面的查询:

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 :(得分:0)

您可以像(@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)))

答案 1 :(得分:0)

如果您混合使用ANDOR条件,最好在其上使用括号( )来明确定义预期条件。

还避免在列上应用函数,因为它将禁止在列上使用索引。如果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 在这里,如果您使用的是SQL Server的早期版本,则查询使用的是STRING_SPLIT(),请使用我在评论中发布的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)
)

答案 2 :(得分:0)

因此,在同事的帮助下,我们创建了一个将csv拆分为临时表的函数,在那里我可以简单地检查临时表中是否有某个值并为其返回布尔值。感谢您的帮助。