2010-03-22 8 views
10

방법 (@param가 null) 값 IS NULL [or] = @param절 + SQL 서버

전 확인하는 곳에서 = NULL 대 NULL IS : 나는 비교 값을 바꾸려면

Select column1 from Table1 
where column2 IS NULL => works fine 

를 (NULL IS)를 @param와 함께 사용합니다. 이 작업을 수행하는 방법

Select column1 from Table1 
where column2 = @param => this works fine until @param got some value in it and if is null never finds a record. 

어떻게이 작업을 수행 할 수 있습니까?

답변

31
select column1 from Table1 
    where (@param is null and column2 is null) 
    or (column2 = @param) 
2

"하나의 크기에 모두 맞는"쿼리 방법은 없지만이 방법에 미묘한 성능 영향이 있습니다. 그냥 쿼리가 아무리 천천히, 적절한 답을 반환하지 만드는 넘어 를 이동하려면 여기를 Dynamic Search Conditions in T-SQLby Erland Sommarskog

에이 문서를 봐에 대한 부분에 대한 링크입니다 x = @x OR @x IS NULL

1
WHERE ((COLUMN1 = @PARAM) OR (COLUMN1 IS NULL AND @PARAM IS NULL)) 
+1

'@ PARAM'이 null 인 경우'COLUMN = @ PARAM'은 결코 참이 아니므로 두 번째 조건 ('@PARAM IS NOT NULL')은 중복됩니다. –

+0

@Damien_The_Unbeliever Jun 당신 말이 맞아요, 중복 코드를 삭제했습니다. 감사합니다. –

0
Select column1 from Table1 
where (column2 IS NULL and @param IS NULL) 
or (column2 IS NOT NULL AND @param IS NOT NULL AND (column2 = @param) ) 
+1

'column2 IS NOT NULL' 검사는 불필요합니다. 이것은'column2 = @ param'에 의해 다루어지기 때문에 불필요합니다.이 대답은 작년부터받은 대답의 덜 간결한 버전입니다. –

+0

작년의 해답은 다음과 같습니다. (@param는 null, column2는 null) 또는 (column2 = @param) @param가 null가 아닌 경우, 최초의 조건은 false가되어, 2 번째는 평가 만됩니다. (column2 = @param) 나는 (column2 = @param) 같은 것을 검사하고 null 일 수 있다는 것을 발견했다. –

2

나는 이것이 오래된 질문이라는 것을 알았지 만 나는 똑같은 대답을하고 또 다른 (더 짧은) 대답을 내놓았다. 참고 : ISNULL (expr, replacement)을 지원하는 MS SQL Server에서만 작동합니다.

SELECT column1 FROM table1 
WHERE ISNULL(column2,'') = ISNULL(@param,'') 

이것은 또한 NULL과 빈 문자열을 같은 방식으로 처리한다고 가정합니다.

+1

을 갖는 것이 안전하다. ISNULL 대신 COALESCE를 사용하도록 SQL을 변경했다면 전자가 후자와 달리 ISO/ANSI로 정의 되었기 때문에 SQL Server 이상의 기능을 수행 할 수 있습니다. –