我有两个可选参数empName,empLoc。这两个参数都可以为null,为空或具有某些值。如果两者都有值,我将必须获取所有值,如果empName具有值,那么我只需要获取empName等于传递参数@empName的值,并且与@empLoc相同。我知道我可以在相同的存储过程中编写单独的sql,但我想使用CASE子句来完成它,因为它将保存大部分重复的代码。但是我在设置查询时遇到问题。我知道这是CASE条款。 这是我的查询:
SELECT
EmpID,
EmpDept
FROM Employee
WHERE TimeStamp = @timeStamp
**AND (CASE
WHEN DATALENGTH(@empName) > 0 THEN EmployeeName LIKE '%' +@empName+'%'
ELSE
EmployeeLocation LIKE '%' +@empLoc+'%'
END)**
注意:我已经对这些参数进行了空检查。此查询也仅在@empName或@empLoc具有某个值时运行。
有任何建议如何解决这个问题?
答案 0 :(得分:4)
实际上你必须在OR的第二部分放置DATALENGTH(@empName)< = 0,因为CASE意味着异或。所以正确的是:
SELECT
EmpID,
EmpDept
FROM Employee
WHERE TimeStamp = @timeStamp
AND
(
(DATALENGTH(@empName) > 0 AND EmployeeName LIKE '%' +@empName+'%')
OR
(DATALENGTH(@empName) <= 0 AND EmployeeLocation LIKE '%' +@empLoc+'%')
)
答案 1 :(得分:1)
CASE
是一个返回值的表达式:
where TimeStamp = @timeStamp and
CASE WHEN DATALENGTH(@empName) > 0 AND EmployeeName LIKE '%' +@empName+'%' THEN 1
WHEN EmployeeLocation LIKE '%' +@empLoc+'%' THEN 1
ELSE 0
END = 1
答案 2 :(得分:0)
如果要修剪空间
,可以使用LEN功能SELECT DATALENGTH(' ') --Result is 1
SELECT LEN(' ') -- Result is 0
答案 3 :(得分:-1)
您不需要case when
声明此问题
SELECT
EmpID,
EmpDept
FROM Employee
WHERE TimeStamp = @timeStamp
AND
( ( DATALENGTH(@empName) > 0 AND EmployeeName LIKE '%' +@empName+'%')
OR
( DATALENGTH(@empName) = 0 AND EmployeeLocation LIKE '%' +@empLoc+'%'))