수색…


소개

SQL Server에서 NULL 은 없거나 알 수없는 데이터를 나타냅니다. 즉, NULL 은 실제로 값이 아닙니다. 그것은 가치에 대한 자리 표시 자로 더 잘 묘사됩니다. 이것은 또한 비교할 수없는 이유입니다 NULL 도 다른 어떤 값, 그리고 NULL .

비고

SQL Server는 IS NULL , IS NOT NULL , ISNULL() , COALESCE() 등의 null을 처리하는 다른 메서드를 제공합니다.

NULL 비교

NULL 은 비교와 관련하여 특별한 경우입니다.

다음 데이터를 가정하십시오.

id someVal
 ----
 0 NULL
 1 1
 2 2

검색어 :

 SELECT id
 FROM table
 WHERE someVal = 1

id 1 반환합니다.

 SELECT id
 FROM table
 WHERE someVal <> 1

id 2 반환합니다.

 SELECT id
 FROM table
 WHERE someVal IS NULL

id 0 반환합니다.

 SELECT id
 FROM table
 WHERE someVal IS NOT NULL

ids 12 반환합니다.

NULL을 = , <> 비교에서 값으로 "계산"하기를 원하면 계수 가능한 데이터 유형으로 변환해야합니다.

 SELECT id
 FROM table
 WHERE ISNULL(someVal, -1) <> 1

또는

 SELECT id
 FROM table
 WHERE someVal IS NULL OR someVal <> 1

02 반환합니다.

또는 ANSI Null 설정을 변경할 수 있습니다.

ANSI NULLS

MSDN에서

이후 버전의 SQL Server에서는 ANSI_NULLS가 항상 ON으로 설정되며 명시 적으로 옵션을 OFF로 설정 한 응용 프로그램에서는 오류가 발생합니다. 새로운 개발 작업에서는이 기능을 사용하지 말고 현재이 기능을 사용하는 응용 프로그램을 수정하십시오.

ANSI NULLS 를 off로 설정하면 null 값의 = / <> 비교가 가능합니다.

주어진 다음 데이터 :

id someVal
 ----
 0 NULL
 1 1
 2 2

ANSI NULLS를 on으로 설정하면 다음 쿼리가 수행됩니다.

 SELECT id
 FROM table
 WHERE someVal = NULL

결과가 나오지 않습니다. 그러나 ANSI NULLS가 해제 된 동일한 쿼리는 다음과 같습니다.

 set ansi_nulls off

 SELECT id
 FROM table
 WHERE someVal = NULL

id 0 반환합니다.

ISNULL ()

IsNull() 함수는 두 개의 매개 변수를 받아들이고 첫 번째 매개 변수가 null 경우 두 번째 매개 변수를 반환합니다.

매개 변수 :

  1. 식을 확인하십시오. 모든 데이터 형식의 표현입니다.
  2. 대체 값. 검사식이 null 인 경우 반환되는 값입니다. 대체 값은 점검 표현식의 데이터 유형으로 내재적으로 변환 될 수있는 데이터 유형이어야합니다.

IsNull() 함수는 check 식과 동일한 데이터 형식을 반환합니다.

DECLARE @MyInt int -- All variables are null until they are set with values.

SELECT ISNULL(@MyInt, 3) -- Returns 3.

위의 COALESCE 도 참조하십시오.

null이거나 null이 아닙니다.

null은 값이 아니기 때문에 null과 비교 연산자를 사용할 수 없습니다.
열 또는 변수가 null을 보유하고 있는지 확인하려면 is null 을 사용해야합니다.

DECLARE @Date date = '2016-08-03'

다음 명령.은 널 (NULL) 값과의 모든 비교가 거짓 또는 알 수 없음으로 평가되므로 값 6 을 선택합니다.

SELECT CASE WHEN @Date = NULL THEN 1
            WHEN @Date <> NULL THEN 2
            WHEN @Date > NULL THEN 3
            WHEN @Date < NULL THEN 4
            WHEN @Date IS NULL THEN 5
            WHEN @Date IS NOT NULL THEN 6

@Date 변수의 내용을 null 하고 다시 시도하면 다음 명령문은 5 를 반환합니다.

SET @Date = NULL -- Note that the '=' here is an assignment operator!

SELECT CASE WHEN @Date = NULL THEN 1
            WHEN @Date <> NULL THEN 2
            WHEN @Date > NULL THEN 3
            WHEN @Date < NULL THEN 4
            WHEN @Date IS NULL THEN 5
            WHEN @Date IS NOT NULL THEN 6

COALESCE ()

COALESCE () 인수를 순서대로 평가하고 처음에 평가되지 않은 첫 번째 표현식의 현재 값을 NULLNULL .

DECLARE @MyInt int -- variable is null until it is set with value.
DECLARE @MyInt2 int -- variable is null until it is set with value.
DECLARE @MyInt3 int -- variable is null until it is set with value.

SET @MyInt3  = 3

SELECT COALESCE (@MyInt, @MyInt2 ,@MyInt3 ,5) -- Returns 3 : value of @MyInt3.

ISNULL ()은 COALESCE ()와 유사하게 작동하지만 ISNULL () 함수는 두 개의 매개 변수 (하나는 검사 할 매개 변수)를 허용하고 첫 번째 매개 변수가 NULL이면 하나만 사용합니다. 아래 ISNULL 도 참조하십시오.

하위 쿼리가없는 NULL

하위 쿼리에서 하위 쿼리를 처리하지 않는 동안 예상 결과를 얻으려면 NULLS를 제거해야합니다.

create table #outertable (i int)
create table #innertable (i int)

insert into #outertable (i) values (1), (2),(3),(4), (5)
insert into #innertable (i) values (2), (3), (null)

select * from #outertable where i in (select i from #innertable)
--2
--3
--So far so good

select * from #outertable where i not in (select i from #innertable)
--Expectation here is to get 1,4,5 but it is not. It will get empty results because of the NULL it executes as {select * from #outertable where i not in (null)}

--To fix this 
select * from #outertable where i not in (select i from #innertable where i is not null)
--you will get expected results
--1
--4
--5

하위 쿼리에서 null을 처리하지 않으면 예상 출력에주의해야합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow