IS [NOT] DISTINCT FROM(Transact-SQL)

적용 대상: Microsoft Fabric의 Microsoft FabricWarehouse에 있는 SQL Server 2022(16.x) Azure SQL DatabaseAzure SQL Managed InstanceSQL 분석 엔드포인트

두 식의 동등성을 비교하고 하나 또는 두 피연산자가 모두 NULL인 경우에도 true 또는 false 결과를 보장합니다.

IS [NOT] DISTINCT FROM은 WHERE 절 및 HAVING 절의 검색 조건, FROM 절의 조인 조건 및 부울 값이 필요한 기타 구문에 사용되는 조건자입니다.

Transact-SQL 구문 표기 규칙

구문

expression IS [NOT] DISTINCT FROM expression

인수

expression

유효한 입니다.

이 식은 열, 상수, 함수, 변수, 스칼라 하위 쿼리이거나 열 이름, 상수 및 연산자나 하위 쿼리로 연결된 함수의 결합일 수 있습니다.

설명

NULL 값을 다른 NULL을 포함한 다른 값과 비교하면 알 수 없는 결과가 발생합니다. IS [NOT] DISTINCT FROM은 비교 연산자로 사용할 때 NULL 값을 알려진 값으로 처리하므로 항상 true 또는 false를 반환합니다.

다음 샘플 표에서는 AB 값을 사용하고 IS [NOT] DISTINCT FROM의 동작을 보여줍니다.

A B A = B A IS NOT DISTINCT FROM B
0 0 True True
0 1 False 거짓
0 NULL Unknown False
NULL NULL Unknown True

연결된 서버에 대해 IS [NOT] DISTINCT FROM이 포함된 쿼리를 실행할 때 연결된 서버에 전송된 쿼리 텍스트는 연결된 서버에 구문 분석 기능이 있는지 여부에 따라 달라집니다.

연결된 서버가 IS [NOT] DISTINCT FROM을 구문 분석할 수 있다고 판단되면 구문을 있는 그대로 디코딩합니다. 연결된 서버가 IS [NOT] DISTINCT FROM을 구문 분석할 수 있는지 확인할 수 없는 경우 다음 식으로 디코딩합니다.

A IS DISTINCT FROM B는 다음으로 디코딩됩니다. ((A <> B OR A IS NULL OR B IS NULL) AND NOT (A IS NULL AND B IS NULL))

A IS NOT DISTINCT FROM B는 다음으로 디코딩됩니다. (NOT (A <> B OR A IS NULL OR B IS NULL) OR (A IS NULL AND B IS NULL))

A. IS DISTINCT FROM 사용

다음 예제에서는 id 필드가 정수 값 17과 구별되는 행을 반환합니다.

DROP TABLE IF EXISTS #SampleTempTable;
GO
CREATE TABLE #SampleTempTable (id INT, message nvarchar(50));
INSERT INTO #SampleTempTable VALUES (null, 'hello') ;
INSERT INTO #SampleTempTable VALUES (10, null);
INSERT INTO #SampleTempTable VALUES (17, 'abc');
INSERT INTO #SampleTempTable VALUES (17, 'yes');
INSERT INTO #SampleTempTable VALUES (null, null);
GO

SELECT * FROM #SampleTempTable WHERE id IS DISTINCT FROM 17;
DROP TABLE IF EXISTS #SampleTempTable;
GO

결과는 id가 값 17과 일치하는 모든 행을 제외합니다.

id          message
----------- ---------
NULL        hello
10          NULL
NULL        NULL

B. IS NOT DISTINCT FROM 사용

다음 예제에서는 id 필드가 정수 값 17과 구별되지 않는 행을 반환합니다.

DROP TABLE IF EXISTS #SampleTempTable;
GO
CREATE TABLE #SampleTempTable (id INT, message nvarchar(50));
INSERT INTO #SampleTempTable VALUES (null, 'hello') ;
INSERT INTO #SampleTempTable VALUES (10, null);
INSERT INTO #SampleTempTable VALUES (17, 'abc');
INSERT INTO #SampleTempTable VALUES (17, 'yes');
INSERT INTO #SampleTempTable VALUES (null, null);
GO

SELECT * FROM #SampleTempTable WHERE id IS NOT DISTINCT FROM 17;
DROP TABLE IF EXISTS #SampleTempTable;
GO

결과는 id가 값 17과 일치하는 행만 반환합니다.

id          message
----------- --------
17          abc
17          yes

C. NULL 값에 대해 IS DISTINCT FROM 사용

다음 예제에서는 id 필드가 NULL과 구별되는 행을 반환합니다.

DROP TABLE IF EXISTS #SampleTempTable;
GO
CREATE TABLE #SampleTempTable (id INT, message nvarchar(50));
INSERT INTO #SampleTempTable VALUES (null, 'hello') ;
INSERT INTO #SampleTempTable VALUES (10, null);
INSERT INTO #SampleTempTable VALUES (17, 'abc');
INSERT INTO #SampleTempTable VALUES (17, 'yes');
INSERT INTO #SampleTempTable VALUES (null, null);
GO

SELECT * FROM #SampleTempTable WHERE id IS DISTINCT FROM NULL;
DROP TABLE IF EXISTS #SampleTempTable;
GO

결과는 id가 NULL이 아닌 행만 반환합니다.

id          message
----------- --------
10          NULL
17          abc
17          yes

D. NULL 값에 대해 IS NOT DISTINCT FROM 사용

다음 예제에서는 id 필드가 NULL과 구별되지 않는 행을 반환합니다.

DROP TABLE IF EXISTS #SampleTempTable;
GO
CREATE TABLE #SampleTempTable (id INT, message nvarchar(50));
INSERT INTO #SampleTempTable VALUES (null, 'hello') ;
INSERT INTO #SampleTempTable VALUES (10, null);
INSERT INTO #SampleTempTable VALUES (17, 'abc');
INSERT INTO #SampleTempTable VALUES (17, 'yes');
INSERT INTO #SampleTempTable VALUES (null, null);
GO

SELECT * FROM #SampleTempTable WHERE id IS NOT DISTINCT FROM NULL;
DROP TABLE IF EXISTS #SampleTempTable;
GO

결과는 id가 NULL인 행만 반환합니다.

id          message
----------- --------
NULL        hello
NULL        NULL

추가 정보