NULL은 어디에 있는지, SQL Server 매개 변수 값에 따라 NULL 또는 NON NOR NON NOR NOR NON

StackOverflow https://stackoverflow.com/questions/810714

  •  03-07-2019
  •  | 
  •  

문제

SQL Server 2000에 매개 변수 값을 기반으로 검색을 수행하는 저장된 절차가 있습니다. 전달 된 매개 변수 중 하나의 경우 다른 것이 필요합니다. WHERE 값에 따라 조항 - 문제는 3 가지 값이 어디에 있다는 것입니다. MyColumn

  1. IS NULL
  2. IS NOT NULL
  3. ANY VALUE (NULL AND NOT NULL) (본질적으로 아니오 WHERE 절)

올바른 구문을 제시하는 데 정신적 인 블록이 있습니다. 이것은 일부를 수행하지 않고 하나의 select 문으로 할 수 있습니까? IF @parameter BEGIN ... END 분기?

도움이 되었습니까?

해결책

다음은 단일을 사용하여 이것을 해결할 수있는 방법입니다. WHERE 절:

WHERE (@myParm = value1 AND MyColumn IS NULL)
OR  (@myParm = value2 AND MyColumn IS NOT NULL)
OR  (@myParm = value3)

사례 진술의 순진한 사용 작동하지 않습니다, 이것은 다음을 의미합니다.

SELECT Field1, Field2 FROM MyTable
WHERE CASE @myParam
    WHEN value1 THEN MyColumn IS NULL
    WHEN value2 THEN MyColumn IS NOT NULL
    WHEN value3 THEN TRUE
END

사례 명령문을 사용 하여이 문제를 해결할 수 있습니다. 대답

다른 팁

당신은 다음과 같은 일을 할 수 있습니다.

SELECT *
FROM foo
WHERE (@param = 0 AND MyColumn IS NULL)
OR (@param = 1 AND MyColumn IS NOT NULL)
OR (@param = 2)

그런 것.

이것이 사용 가능한 방법입니다 CASE:

DECLARE @myParam INT;
SET @myParam = 1;

SELECT * 
  FROM MyTable
 WHERE 'T' = CASE @myParam
             WHEN 1 THEN 
                CASE WHEN MyColumn IS NULL THEN 'T' END
             WHEN 2 THEN
                CASE WHEN MyColumn IS NOT NULL THEN 'T' END
             WHEN 3 THEN 'T' END;
WHERE MyColumn = COALESCE(@value,MyColumn) 
  • 만약에 @value ~이다 NULL, 그것은 비교할 것입니다 MyColumn 그 자체로 무시합니다@value = no where 절.

  • 만약에 @value 값이 있습니다 (NOT NULL) 비교합니다 MyColumn 에게@value.

참조: Coalesce (Transact-SQL).

다른 사례 :

SELECT *  
FROM MyTable
WHERE 1 = CASE WHEN @myParm = value1 AND MyColumn IS NULL     THEN 1 
               WHEN @myParm = value2 AND MyColumn IS NOT NULL THEN 1 
               WHEN @myParm = value3                          THEN 1 
          END

이 솔루션으로 성공했습니다. 그것은 약간 뒤틀린 패트릭과 거의 비슷합니다. 이 표현식을 별도로 또는 순서대로 사용할 수 있습니다. 매개 변수가 비어 있으면 무시되고 Nulls를 포함하여 검색 열의 모든 값이 표시됩니다.

SELECT * FROM MyTable
WHERE 
    --check to see if @param1 exists, if @param1 is blank, return all
    --records excluding filters below
(Col1 LIKE '%' + @param1 + '%' OR @param1 = '')
AND
    --where you want to search multiple columns using the same parameter
    --enclose the first 'OR' expression in braces and enclose the entire 
    --expression 
((Col2 LIKE '%' + @searchString + '%' OR Col3 LIKE '%' + @searchString + '%') OR @searchString = '')
AND
    --if your search requires a date you could do the following
(Cast(DateCol AS DATE) BETWEEN CAST(@dateParam AS Date) AND CAST(GETDATE() AS DATE) OR @dateParam = '')
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top