1

オプションのパラメーター empName と empLoc が 2 つあります。これらのパラメーターは両方とも、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)**

注:これらのパラメーターのnullチェックはすでに行っています。また、このクエリは、@empName または @empLoc のいずれかに何らかの値がある場合にのみ実行されます。

これを修正する方法はありますか?

4

4 に答える 4

4

CASE は排他的 OR を意味するため、実際には OR の 2 番目の部分に DATALENGTH(@empName) <= 0 を配置する必要があります。したがって、正しいものは次のようになります。

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 に答える