SQL CASE在Where子句中?

时间:2012-05-18 20:26:32

标签: sql sql-server case

我有两个可选参数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具有某个值时运行。

有任何建议如何解决这个问题?

4 个答案:

答案 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+'%'))