복붙노트

[SQL] WHERE, SQL Server의 CASE

SQL

WHERE, SQL Server의 CASE

나는 사용자가 일부 조항 드롭 다운 메뉴에서 선택하는 몇 가지 검색을하고 있어요. 그들이 어떤 상자가 비어 떠날 때, 나는 쿼리 절을 무시해야합니다. 나는 CASE를 알고, 내가 생각 최고의 내가 저장 프로 시저의 매개 변수에 0을 전달하면, 그것은 다음과 같이 해당 매개 변수를 무시한다는 것입니다.

WHERE a.Country = (CASE WHEN @Country > 0 THEN @Country ELSE (something else) END)

그래서, (뭔가 다른) 어떤 조건이 같아야합니다, 그것은 국가 ID는 1> 모두에서,하지만 난 사용하는 방법을 모른다>과 = 같은 경우에서와 같이 '> 0'이 될 수 있습니다.

어떤 제안?

해결법

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

    1.몇 가지 방법 :

    몇 가지 방법 :

    -- Do the comparison, OR'd with a check on the @Country=0 case
    WHERE (a.Country = @Country OR @Country = 0)
    
    -- compare the Country field to itself
    WHERE a.Country = CASE WHEN @Country > 0 THEN @Country ELSE a.Country END
    

    또는 동적으로 생성 된 문을 사용하고 적절한 경우에만 국가 조건에 추가 할 수 있습니다. 이것은 당신이 실제로 적용해야하고 지원하는 지수가 제자리에있는 경우 더 나은 실행 계획을 초래할 수있는 조건 쿼리를 실행한다는 의미에서 가장 효율적인해야한다. 당신은 SQL 주입에 방지하기 위해 매개 변수화 SQL을 사용해야합니다.

  2. ==============================

    2.당신은 할 수 단순화 할 수 있습니다 :

    당신은 할 수 단순화 할 수 있습니다 :

    WHERE a.Country = COALESCE(NULLIF(@Country,0), a.Country);
    
  3. ==============================

    3.(뭔가 다른) a.Country해야한다

    (뭔가 다른) a.Country해야한다

    국가 널 (NULL) 인 경우 다음 수 a.Country 또는 a.Country은 NULL입니다 (다른 것) 만들기

  4. ==============================

    4.

    .. ELSE a.Country ...
    

    나는 가정

  5. ==============================

    5.이 시도:

    이 시도:

    WHERE a.Country = (CASE WHEN @Country > 0 THEN @Country ELSE a.Country END)
    
  6. from https://stackoverflow.com/questions/10191424/case-in-where-sql-server by cc-by-sa and MIT license