2014-11-10 7 views
0

원래 C#에서 검색 문자열을 작성하고이를 사용하여 DB를 검색했지만 저장 프로 시저를 사용하도록 전환하기 시작했습니다. 내가 뭘 하려는지 @DeletedDeviceSearch 변수가 false 일 때 검색 문자열에 'LogicallYDeleted = 0'을 추가합니다. 그렇지 않으면 논리적으로 삭제 된 장치와 현재 장치를 모두 검색합니다.CASE 문에서 SQL WHERE 절

WHERE 절에 문제가 있습니다. 거기하는 where 절에서

USE Inventory; 
GO 
CREATE PROCEDURE [dbo.InventorySearch] 
    @FieldName nvarchar(50), 
    @SearchTerm nvarchar(50) 
    @DeletedDeviceSearch bit 
AS 
SET NOCOUNT ON; 
SELECT LK_User, LK_Location, DeviceName, AssetTypeId, DeviceID, SerialNumber, LogicallyDeleted 
FROM Device 
WHERE 

(CASE(@DeviceSearch) 
    WHEN 1 THEN 
     LogicallyDeleted = 0 and @FieldName = @SearchTerm 

     ELSE @FieldName = @SearchTerm) 
GO 

답변

2

: 나는 CASE 문이 갈 수있는 방법이라고 생각하지만, 나는 ... 어떤 도움이 아래

을 감사를 구성하는 방법을 잘 모르겠습니다 코드입니다 가고 싶은 더 좋은 방법이 있지만 case. 이처럼 where 절을 쓸 수있다 : 당신이 정말case 문을 사용하려면

WHERE 
    (@DeviceSearch = 1 and LogicallyDeleted = 0 and @FieldName = @SearchTerm) OR 
    (@DeviceSearch <> 1 and @FieldName = @SearchTerm) 

그러나, case가 값을 반환하고, 뭔가를 실행하지 않습니다. 그래서 다음과 같이 읽어야합니다 : 여기

WHERE 
    LogicallyDeleted = CASE WHEN @DeviceSearch = 1 THEN 0 ELSE LogicallyDeleted END AND 
    @FieldName = @SearchTerm 

트릭은 LogicallyDeleted 만 0-@DeviceSearch = 1 경우와 비교된다는 점이다. 다른 모든 경우에 LogicallyDeleted이 자체와 비교되며 항상 true를 반환합니다. @DeviceSearch가 1

WHERE LogicallyDeleted = LogicallyDeleted AND @FieldName = @SearchTerm 

경우, where 절은 다음과 같이 읽습니다 : @DeviceSearch 1이 아닌 경우

따라서는 where 절은 다음과 같이 읽고이 SP를 사용하는

WHERE LogicallyDeleted = 0 AND @FieldName = @SearchTerm 
+0

은 정말 신속한 답변을 주셔서 감사합니다. 코드가 작동하는 방법에 대한 설명은 매우 유용합니다 ... – michaelk46

0

때문에 검색 목적을 위해 (그러므로 SPEEEED와 정확도는 필수입니다) 나는 SP 콘텐츠를 이렇게 만들 것입니다 :

ELSE IF (@DeviceSearch = 1)
시작
SELECT LK_User, LK_Location, 장치 이름, AssetTypeId,의 DeviceID, serialNumber를이 장치 LogicallyDeleted
FROM
LogicallyDeleted = 0 = @FieldName @SearchTerm
END


SELECT LK_User, LK_Location, 장치 이름, AssetTypeId,의 DeviceID, serialNumber를가 WHERE @FieldName = @SearchTerm
장치를
FROM
을 LogicallyDeleted BEGINEND는

나는이 유지하는 것이 더 어렵다는 것을 알고 선택 statemens 중복 "모양"그러나이 방법은 빠른 ..

+0

BTW, 조건 (들)을 사용하면 안됩니까? ... @FieldName like '%'+ + '%' –

+0

왜 더 빠를까요? –

+0

나는 그 조건들이 논리적으로 OR에 "연결"되어 있다는 것을 알기 때문에 성능이 좋지 않습니다.그래서이 특별한 경우에 위의 대안을 제안하고 OR-ed 조건을 사용하지 않기 위해 노력했습니다. 거기에 추가 할 수있는 무언가가 else branch select statement의 where 절에서 추가 조건과 LogicallyDeleted <> 0이 추가 된 것 같습니다. –