2011-04-11 3 views
0

내가 같은 조건부 WHERE 절을하고 싶은 WHERE 조건 :는 TSQL에서 절을하는 SQL Server 쿼리에서 운영 문제

WHERE id_A = CASE WHEN @id != 0 THEN @id ELSE anything but @id END 

을 나는 방법 ELSE 부분을 작성하는 아무 생각이 없습니다. 한 경우에는 WHERE id_A = @id이 필요하지만 ELSE의 경우 WHERE id_A != @id이 필요합니다.

도움 주셔서 감사합니다.

WHERE id_a = CASE 
       WHEN @id = 0 THEN CASE 
            WHEN id_a <> 0 THEN id_a 
            END 
       ELSE @id 
       END 

이 그것을해야 id_a 가정

답변

1
--will match always (if id_A can not be NULL 
WHERE 
    id_A = CASE WHEN @id <> 0 THEN @id ELSE id_A END 

-- will be false always 
WHERE 
    id_A = CASE WHEN @id <> 0 THEN @id ELSE NULL END 

이이의 라인을 따라 뭔가 시도

WHERE 
    id_A = ISNULL(NULLIF(@id, 0), id_A) 

WHERE 
    id_A = NULLIF(@id, 0) 
3

과 같이 쓸 수있다 :

WHERE (@id != 0 AND id_A = @id) OR (@id = 0 AND id_A != @id) 

참고 쿼리는 다음 상당히 다른 행 수를 반환 할 가능성이있는 경우에 당신이해야 대신 두 개의 검색어로 분리하여 두 검색어에 대한 최적의 검색어 계획이 있는지 확인하십시오. 행은 다음을 참조하십시오.

IF @id != 0 THEN 
BEGIN 
    SELECT /* columns from table */ 
    WHERE id_A = @id 
END 
ELSE 
BEGIN 
    SELECT /* columns from table */ 
    WHERE id_A != 0 
END 

불행하게도 이것은 나머지 SQL 쿼리를 복제하는 것을 의미하지만 한 변형이 대부분의 테이블을 반환하지만 첫 번째 변형은 단일 행만 반환하는 경우에 더 잘 수행 될 수 있습니다.

+1

@Martin 감사합니다. 실제로 코드를 실행하지 않고 코드를 게시하도록 가르쳐줍니다! – Justin

+0

Kragen 덕분에 "원 - 라인"솔루션이 내가하고 싶은 일에 완벽하게 작동한다고 생각하지는 않았지만 마침내 간단 해졌습니다. – benj007