2016-11-07 1 views
0

매개 변수 만 변경하는 것이 아니라 SQL Server 2014 쿼리의 WHERE 절에 완전히 다른 조건을 사용하려고합니다. 변수의 @의 cwid2이 NULL 또는 비어있는 경우WHERE 절에서 조건부 다른 열을 사용하는 방법은 무엇입니까?

나는 그래서 여기

dbo.SecurityCheckLDAPGroupName.DatabaseUserName = @role2 

와 AND-성명의 전체 첫번째 부품을 교체하고자하는 경우에는 다음의 약관을

WHERE  (dbo.SecurityCheckUserInADGroups.CWID = @cwid2) AND (dbo.SecurityCheckUserInDatabaseRoles.Server = @server) 

이 매개 변수뿐 아니라 열도 변경됩니다.

는이 같은 뭔가하면, 케이스 및 IIF을 시도했지만이 허용되지 않습니다

(IIF (LEN(@cwid1) > '0, 'dbo.SecurityCheckUserInADGroups.CWID = @cwid2','dbo.SecurityCheckLDAPGroupName.DatabaseUserName = @role2')) 

그것은 조건이다 "문맥에 지정된 부울이 아닌 유형의 표현을 말해 유지 예상 됨 "

어떻게 해결할 수 있습니까?

+0

사용 AND/OR 대신입니다 이유입니다. – jarlh

답변

0
WHERE CASE WHEN ISNULL(@cwid2,'') <> '' THEN dbo.SecurityCheckUserInADGroups 

.CWID = @ cwid2 ELSE dbo.SecurityCheckLDAPGroupName.DatabaseUserName = @ END role2와 dbo.SecurityCheckUserInDatabaseRoles.Server = @server

0

그냥 기본 논리를 사용

WHERE ((@cwid <> '' AND dbo.SecurityCheckUserInADGroups.CWID = @cwid2) OR 
     (COALESCE(@cwid, '') = '' AND dbo.SecurityCheckLDAPGroupName.DatabaseUserName = @role2) 
    ) AND 
     (dbo.SecurityCheckUserInDatabaseRoles.Server = @server) 
0

은 가장 일반적 솔루션은

Where (@var is null and col1=val1) 
    Or (@var is not null and col2=val2) 

일 수 있습니다. 쿼리 최적화 프로그램은 때로는 O R, 성능이 문제가 될 수있는 경우 다른 솔루션을 찾는 경향이 있지만 (위대한 데이터 세트 등) 위의 내용이 먼저 시도해 볼 가치가있을 수 있습니다.

좀 더 구체적인 것이 필요하다면, iif 로직의 트릭은 평가할 술어가 아닌 비교할 값을 반환한다는 것입니다. COL2의 값처럼 var에 null의 경우 - - 당신은 생각이 여기에 당신이 경우 "를 걱정하지 않는다"이다

Where col1 = iif(@var is null, val1, col1) 
    And col2 = iif(var is null, col2, val2) 

같은 것을 할 수있는 "항상 참"으로 해결. 그러나이 특정 솔루션이 실패하는 경우가 있습니다 (예 : col1 또는 col2가 NULL 일 수 있음).

첫 번째 방법이 가장 일반적인