복붙노트

[SQL] WHERE 절에서 선택적 인수 [중복]

SQL

WHERE 절에서 선택적 인수 [중복]

3 PARAMS가있는 저장 프로 시저가 있다고 가정 할 수 있습니다. 모든 가능성 중, 내가 사용하는 ()와 () 또는 () 너무 많이와 걷잡을 수없이 WHERE 절 하나에 이것을 달성하기 위해 찾고 있어요 ...

예:

    //Params
@CITY VARCHAR(100) = NULL,
@GENDER VARCHAR(100) = NULL,
@AGE VARCHAR(100) = NULL

난 당신이 IF 시작 ... 각 변수에 대한 END를있는 경우 사용을 할 수 있다고 생각하지만, 그 코드를 많이 생각보다 길 수 있습니다 ..

그 방법은 너무 오래 (같은 10 개 가지 분야에 대해이 있지만 예제는 3 인) 때문에이 방법은 아래에 작동하지 않으며 심지어 직접 고유 한 값을 끌어 있는지 확실하지 않습니다 ...

SELECT NAME FROM TABLE 
WHERE (
(CITY=@CITY AND GENDER=@GENDER AND AGE=@AGE)
OR (CITY=@CITY AND GENDER=@GENDER)
OR (GENDER=@GENDER AND AGE=@AGE)
OR (CITY=@CITY AND AGE=@AGE)
OR (CITY=@CITY)
OR (GENDER=@GENDER)
OR (AGE=@AGE)
)

이 작업을 수행하는 더 짧은 더 효율적인 방법이 있나요?

이 방법은 또한의 가입과 호환 될 수 있도록 그렇다면, 그것은 바람직하다.

해결법

  1. ==============================

    1.대안 ISNULL / COALESCE 옵션에, 당신은 널 (null) 인을위한 매개 변수를 테스트 할 수 있습니다 :

    대안 ISNULL / COALESCE 옵션에, 당신은 널 (null) 인을위한 매개 변수를 테스트 할 수 있습니다 :

    SELECT NAME  
    FROM TABLE  
    WHERE  
        (@City IS NULL OR City = @City)
    AND 
        (@Gender IS NULL OR Gender = @Gender)
    AND 
        (@Age IS NULL OR Age = @Age) 
    
  2. ==============================

    2.무엇에 대해?

    무엇에 대해?

    SELECT
        NAME
    FROM TABLE 
    WHERE CITY = COALESCE(@CITY, CITY)
        AND GENDER = COALESCE(@GENDER, GENDER)
        AND AGE = COALESCE(@AGE, AGE)
    
  3. ==============================

    3.이 같은 시도 :

    이 같은 시도 :

    SELECT NAME 
    FROM TABLE 
    WHERE 
        City = IsNull(@City, City) AND
        Gender = IsNull(@Gender, Gender) AND
        Age = IsNull(@Age, Age)
    

    또는:

    SELECT NAME 
    FROM TABLE 
    WHERE 
        (City = @City OR @City IS NULL) AND
        (Gender = @Gender OR @Gender IS NULL) AND
        (Age = @Age OR @Age IS NULL)
    
  4. ==============================

    4.

    SELECT NAME   
    FROM TABLE   
    WHERE       
      City = case when isnull(@City ,'') = '' then City
                            else @City end
    AND      
      Gender = case when isnull(@Gender ,'') = '' then Gender
                            else @Gender end
    AND  
      Age = case when isnull(@Age ,0) = 0 then Age
                            else @Age end    
    
  5. ==============================

    5.아마이 :

    아마이 :

    create procedure myProc
        --Params
    @CITY VARCHAR(100) = NULL,
    @GENDER VARCHAR(100) = NULL,
    @AGE VARCHAR(100) = NULL
    as
    
    SELECT NAME FROM [TABLE]
    WHERE ISNULL(CITY,'')=ISNULL(@CITY,ISNULL(CITY,''))
    AND ISNULL(GENDER,'')=ISNULL(@GENDER,ISNULL(GENDER,''))
    AND ISNULL(AGE,'')=ISNULL(@AGE,ISNULL(AGE,''))
    go
    

    WHERE 절에 열을 가정 널 비교를 피하기 위해 ISNULL을 사용하여, 널 (NULL)입니다.

  6. from https://stackoverflow.com/questions/10185638/optional-arguments-in-where-clause by cc-by-sa and MIT license