2012-02-02 7 views
4

CountryID이 매개 변수로 제공되지 않는 한 모든 Country 행을 반환하는 SP를 만들려고합니다. 여기 그것이 내가 어떻게 작동할지 상상했던 방식이지만, 그것을 좋아하지 않는다.조건부 WHERE 문 SQL Server

ALTER PROCEDURE [dbo].[usp_return_countries] 
    @CountryID AS INT = 0 
AS 
BEGIN 
     SELECT * 
     FROM Countries 
     WHERE Active = 1 

     IF @CountryID > 0 BEGIN 
      AND @CountryID = CountryID 
     END 

END 

당신에게

추신 : 감사 나는 상기 조건에 기반하여 전체 SELECT 문을 단순히 반복하는 것보다 더 좋은 방법이있을 것이라고 생각했습니다.

답변

8

이 시도를, 그것은 우아 :)

ALTER PROCEDURE [dbo].[usp_return_countries] 
    @CountryID AS INT = 0 
AS 
BEGIN 

    SELECT * 
    FROM Countries 
    WHERE Active = 1 
    AND (@CountryID = 0 OR @CountryID = CountryID) 

END 
+0

아 물론. 나는 이것을 보았지만 CountryID 테이블을 0으로 일치 시키면 혼란 스러웠습니다. 완벽한, 감사합니다 – David

+0

다행이 당신을 위해 일했습니다. –

4

것은 이런 식으로 작업을 수행 : 단일 WHERE 절에 마무리 할만큼 쉬운

ALTER PROCEDURE [dbo].[usp_return_countries] 
    @CountryID AS INT = 0 AS BEGIN 

     IF @CountryID > 0 BEGIN 
      SELECT * 
      FROM Countries 
      WHERE Active = 1 
      AND @CountryID = CountryID 
     END 
     ELSE BEGIN 
      SELECT * 
      FROM Countries 
      WHERE Active = 1 
     END 

END 
+0

엄청난 select 문이 있어도 추가 조건으로 전체를 반복해야합니까? – David

+0

@David 더 읽기 쉽습니다. 원하는 경우 다른 답변 상태와 같이보다 세련된 방식을 선택할 수 있습니다. 그러나'select '를 반복 할 수 있다는 것을 기억하십시오. 실제로 하나만 만들어집니다 : P –

+0

select 문을 반복하는 것이 아닌 다른 것을 원했습니다. 어쨌든 고마워. – David

4

:

SELECT * 
FROM Countries 
WHERE Active = 1 AND (@CountryID = 0 OR CountryID = @CountryID) 
+0

+1 나는 또한 같은 대답을 가지고있다 :) –

2

같은 뭔가 이?

SELECT * 
     FROM Countries 
     WHERE Active = 1 
AND 
    (CountryID = @CountryID AND @CountryID <> 0) or (@CountryID = 0)