2017-03-07 6 views
0

쿼리 결과가 null이지만 쿼리가 여전히 null을 반환하면 00001을 표시하려고합니다. 내 질문에 무슨 문제가 있는지 모르겠다.SQL ISNULL이 작동하지 않습니다.

편집 :

OBRNo 가정하면 123-5678-10-13-1619이다는 LEN(a.OBRNo) is 19

SELECT TOP 1 CASE WHEN RIGHT(a.OBRNo, 5) = NULL THEN '00001' ELSE a.OBRNo 
END as CaseWhen, 
ISNULL(a.OBRNo, '00001') as ISNULL, 
RIGHT(OBRNo, 5) as OrderBy 
FROM tbl_T_BMSCurrentControl as a 
WHERE LEN(a.OBRNo) = 20 and a.ActionCode = 1 
ORDER BY OrderBy DESC 

enter image description here

+2

FALSENULL AND a.ActionCode = 1은 처리 필터링 NULL 될 것입니다 :

이 시도 (a.OBRNo) = 20' – devio

+0

먼저 'a.OBRNo'가 빈 문자열이 아니겠습니까? – anatol

+1

쿼리가 null을 반환하지 않습니다. 아무 것도 반환하지 않습니다. 'isnull'는 아무 것도없는 행을 만들 수 없습니다. 그리고'len (a.OBRNo) = 20'에 의해 필터링하고 있기 때문에 어떤 null'a.OBRNo' 값도 반환 할 수 없으며, 항상 null 값에 대해 거짓이됩니다. 아직도 확실히 20이되지 않을 것입니다 :)). ANSI SQL에서 nulls가 작동하는 방식을 확인하고 싶을 수도 있습니다. 올바르게 진행하는 것이 중요합니다. – Luaan

답변

4

하지 = NULL으로, IS NULL/IS NOT NULLNULL와 비교 의미한다.

SELECT TOP 1 CASE WHEN RIGHT(a.OBRNo, 5) IS NULL THEN '00001' ELSE a.OBRNo END 
... 

당신은 SET ANSI_NULLS으로이 동작을 변경할 수 있습니다.

기본적으로 =와 비교할 수없는 이유는 NULL은 정의되지 않은 것을 의미합니다. 심지어는 NULL도 알 수없는 것과 같지 않습니다. NULL과 비교하면 결과는 알 수 없으므로 NULL입니다.

+1

나는이 질문이 또 다른 경우에 관한 것이라고 생각한다. 'ISNULL (a.OBRNo,'00001 ') as ISNULL' – anatol

+0

@anatol 아니, 결과에 대한 OP의 오해이다. 결과가 없으며 null이있는 행이 아니다. 그 이유는 Tim이 지적했듯이 잘못된 필터 때문입니다. – Luaan

1

쿼리의 행이 반환됩니까?

ISNULL (x,y)은 예상 한대로 수행해야합니다. 즉, WHERENULLS으로 인해 모든 레코드를 필터링하고있는 것 같습니다.

SELECT TOP 1 CASE WHEN RIGHT(a.OBRNo, 5) = NULL THEN '00001' ELSE a.OBRNo 
END as CaseWhen, 
ISNULL(a.OBRNo, '00001') as ISNULL, 
RIGHT(OBRNo, 5) as OrderBy 
FROM tbl_T_BMSCurrentControl as a 
WHERE (a.OBRNo IS NULL OR LEN(a.OBRNo) = 20) and a.ActionCode = 1 
ORDER BY OrderBy DESC 

LEN(a.OBRNo)a.OBRNo NULL되는 것은 NULL 그렇게 NULL = 20NULL 될 것입니다 될 것이며 나는 NULL 결과가 'WHERE LEN 일치 궁금