즉 , 첫 번째 예에서 사용 하면 @region
is NULL
인 경우 테이블에 Region
가 있는 행이 있더라도 행이 반환되지 않습니다 NULL
.
ANSI_NULLS
이 on 일 때 (항상 설정해야합니다.이 옵션을 사용하지 않는 옵션은 향후 제거 될 예정이므로), 피연산자 중 하나가 (적어도) 하나의 비교 연산 NULL
이 세 번째 논리 값을 생성합니다- UNKNOWN
( 반대로 TRUE
하고 FALSE
).
UNKNOWN
그들은 이미 (예를 들어 결정하지 않는 경우 값이 어떤 조합 부울 연산자를 통해 전파 AND
와 FALSE
피연산자 또는 OR
와 TRUE
피연산자) 또는 부정 ( NOT
).
WHERE
절에 의해 생성 된 결과 세트를 필터링하는 데 사용되는 FROM
절의 전반적인 값이되도록 WHERE
절이어야 TRUE
하는 행에 대한 필터링 할 수 없다. 따라서 UNKNOWN
어떤 비교에 의해 생성되는 경우 행이 필터링됩니다.
@ user1227804의 답변 에는 다음 인용문이 포함됩니다.
비교의 양쪽이 모두 열 또는 복합 표현식 인 경우 설정은 비교에 영향을주지 않습니다.
에서 *SET ANSI_NULLS
그러나 두 NULL
열을 비교하면 (예 : a JOIN
) 비교가 여전히 실패 하기 때문에 어떤 지점을 만들려고하는지 잘 모르겠습니다 .
create table
ID int not null,
Val1 varchar(10) null
)
insert into
create table
ID int not null,
Val1 varchar(10) null
)
insert into
select * from
위의 쿼리는 0 개의 행을 반환하는 반면 :
select * from
한 행을 반환합니다. 따라서 두 피연산자가 모두 열인 경우에도 NULL
같지 않습니다 NULL
. 그리고에 대한 문서=
에는 피연산자에 대해 말할 것이 없습니다.
두 NULL
표현식 을 비교할 때 결과는 ANSI_NULLS
설정에 따라 다릅니다 .
가로 ANSI_NULLS
설정된 경우 ON
결과는 NULL
1 이며 NULL
(또는 알 수없는) 값이 다른 NULL
값이나 알 수없는 값 과 같지 않다는 ANSI 규칙을 따릅니다 .
가로 ANSI_NULLS
설정된 경우 비교 OFF
결과 는 입니다.NULL
NULL
TRUE
값 NULL
이 아닌 것과 비교하면 NULL
항상 FALSE
2가 됩니다.
그러나 1 과 2 는 모두 정확하지 않습니다 UNKNOWN
. 두 비교 결과는 모두입니다 .
* 이 텍스트의 비밀스러운 의미는 몇 년 후 마침내 발견되었습니다. 실제로 의미하는 것은 이러한 비교의 경우 설정이 효과가 없으며 항상 설정이 ON 인 것처럼 작동한다는 것 입니다. 그것이 SET ANSI_NULLS OFF
영향을 미치지 않는 설정이라고 언급했다면 더 분명했을 것 입니다.