1

我有两个可选参数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

4 回答 4

4

实际上,您必须将 DATALENGTH(@empName) <= 0 放在 OR 的第二部分,因为 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+'%')
)
于 2012-05-18T20:38:56.010 回答
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
于 2012-05-18T20:36:11.703 回答
0

如果要修剪空间,可以使用 LEN 功能

SELECT DATALENGTH(' ') --Result is 1
SELECT LEN(' ') -- Result is 0
于 2012-05-18T23:26:37.460 回答
-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+'%'))
于 2012-05-18T20:35:24.620 回答