2011-05-12 2 views
0

나는 아주 간단해야 ISNULL 내가 생각했던 일을하지 않는 뭔가를하려고합니다.NULL 데이터베이스 필드와 ISNULL 사용

기본적으로 저장 프로 시저가 있고 PARAM1 또는 PARAM2가 내 테이블에서 일치하는 값을 가질 것으로 예상됩니다.

SELECT * FROM MyTable WITH (NOLOCK) 
     WHERE  
     field1 = ISNULL(@PARAM1 ,field1) 
     AND   
     field2 = @PARAM2 

내 행에 NULL 필드가있을 때까지 제대로 작동하지만 그 결과는 제외됩니다. 이 문제를 해결할 수있는 다른 방법이 있습니까?

답변

2

ISNULL은 첫 번째 값을 두 번째 값으로 바꿉니다. 따라서 @ PARAM1 매개 변수가 NULL이면 PARAM1로 바꿉니다. NULL 값을 전달하지 않는다고 가정하므로 아마도 원하는 값이 아닐 수 있습니다. 더 많은 가능성이 당신은 내가 당신도 이런 식으로 ISNULL을 사용할 수 있다고 가정

WHERE 
(Field1 = @PARAM1 OR Field1 IS NULL) 
AND 
Field2 = @Param2 

을하고 싶은 말 :이 평가됩니다

ISNULL(Field1, @PARAM1) = @PARAM1 
+0

아니요 영업 이익에 통과 중'@ PARAM1' 또는'@ PARAM2'하고이 매개 변수를하고자하는'NULL' 효과적으로'무 OP' 수 없습니다. 'PARAM1 ='을 수행하는 행위가 아니라면 그 컬럼이 NULL 인 행을 제외시킬 것입니다. –

+0

매개 변수 1 또는 2는 null 일 수 있습니다. 나는 오직 내가 관심있는 param을 전달하고 다른 것은 null로 설정된다. – Andrew

+0

Martin, 그것이 내가 말했던 것이다. 열 값이 NULL 인 경우 ("내 행에 NULL 필드가있을 때까지"라고 말함) @ PARAM1 (NULL이 아님)은이 열과 일치하지 않습니다. 따라서 그는 열 값에 ISNULL을 사용하거나 Param1이 NULL인지 확인해야합니다. – Ryan

1

사용

field1 = ISNULL(@PARAM1, A_REPLACEMENT_VALUE_IF_PARAM1_IS_NULL) 

필드 1 대 = @ PARAM1이 NULL이 아닌 경우 @ PARAM1. @ PARAM1 이 NULL

EDIT 경우

필드 1 = A_REPLACEMENT_VALUE_IF_PARAM1_IS_NULL :

다음을 시도해보십시오

--If you want to ignore the WHERE clause if PARAM1/2 is null 
ISNULL(field1, DEFAULT_VALUE) = ISNULL(@PARAM1, ISNULL(field1, DEFAULT_VALUE)) 
OR 
ISNULL(field2, DEFAULT_VALUE) = ISNULL(@PARAM2, ISNULL(field2, DEFAULT_VALUE)) 

또는

--To get all rows with field1/2 as PARAM1/2 and ignore everything else 
field1 = @PARAM1 OR field2 = @PARAM2 
+0

그게 내가하는 일이야. 그렇지 않니? – Andrew

+0

@ 앤디 ISNULL (PARAM1, DEFAULT_VALUE) = ISNULL (@ PARAM1, DEFAULT_VALUE) – Lobo

+1

@Andi 왜 PARAM1 = @ PARAM1 또는 PARAM2 = @ PARAM2를 시도 할 수 없습니까? – Lobo

1

널 (null)이 SQL에서 특별하다. 열에 대해 비교를 수행하면 해당 열에 대해 널 (NULL)이있는 모든 행이 제외됩니다.

SELECT * FROM MyTable WITH (NOLOCK) 
     WHERE  
     (PARAM1 = @PARAM1 or PARAM1 is null) 
     AND   
     (PARAM2 = @PARAM2 or PARAM2 is null) 
관련 문제