2013-01-18 3 views
0

내 선택 문에서 필드 중 하나로서이를 반환 빈 문자열, 나는 여전히 일부 레코드에 대해 NULL을 다시 얻고있다. 그것들을 빈 문자열로 대체하는 것이 아니며 이유를 알지 못합니다.ISNULL은 여전히 ​​널 (NULL)이

답변

1

행을 찾을 수없는 경우 subselect가 실제로 NULL을 리턴하는 것을 알 수 있습니다. where 절 화재 TagNames이 NULL입니다 행이 TagNames_CTE에서 발견되는 경우

, 그것은 함수에 의해 ''로 변환 얻을 것이다.

그러나 행이 전혀 발견되지 않는 경우 NULL이며, 전체 부속 선택의 결과 (그것의 마술을 작동하려면 행이 없기 때문에)는 를 반환하기 때문에 함수가 호출되지 않습니다 외부 선택을 위해 그 열에 뭔가.

select 1, 
     (select isnull (null,2) from dummytable where 1 = 0) 
from dummytable 
:의 라인을 따라 몇 가지 간단한 쿼리를 시도 -

확인하는 쉬운 방법은 그 자체 (ISNULL()하지 않고) 하위 쿼리를 실행하고 모든 NULL을 포함하는 행 또는 어떤 행을 반환하는지 확인하는 것입니다

과 :

select 1, 
     (select isnull (null,2) from dummytable where 1 = 1) 
from dummytable 

당신은 아마 후자는 당신에게 1,2를 제공하는 동안 전 당신에게 1, null을주는 것을 확인할 수 있습니다. 다음과 같은 진술로 MySQL에서 테스트 한 결과, 이것이 맞을 가능성이 있음을 알 수 있습니다.

> create table xyzzy (plugh integer); 

> insert into xyzzy values (42): 

> select 1,(select ifnull (null, 2) from xyzzy where 1 = 0) from xyzzy; 
1 NULL 

> select 1,(select ifnull (null, 2) from xyzzy where 1 = 1) from xyzzy; 
1 2 
+0

hmmm 사람은 거품이 날아 오르고 마지막 ISNULL이 이것을 처리했다고 생각할 것이다. 캐치 올? – PositiveGuy

+0

@ 커피, 아니, 나는 그렇게 생각하지 않는다. 'ISNULL'은 한 레벨에서 실제'선택 '이다. – paxdiablo

1

서브 쿼리 안에, ISNULL이 실제로 행에 존재하는 NULL에 영향을 미칠 수 있기 때문에.

select 
     ...some fields 
      ISNULL((select TagNames from TagNames_CTE as tagNames 
     where Content.ID = tagNames.EntryID), '') as tags 
from SomeTable 

때문에 서브 쿼리의 외부로 이동 : 나는 당신이 실제로 하위 쿼리 반환하지 행의 경우에 대처하기 위해 필요한 가정합니다. (나는 또한 보통 COALESCEISNULL 이상으로 권장하고있다. 이것은 표준 SQL이며, 여러 매개 변수를 지원하고 강제 형 변환이 가능하다.)