因此,我需要确定传递的参数中是否存在某个值才能执行某种条件。这是下面的查询:
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条件。
答案 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)
如果您混合使用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
在这里,如果您使用的是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拆分为临时表的函数,在那里我可以简单地检查临时表中是否有某个值并为其返回布尔值。感谢您的帮助。