IS [NOT] DISTINCT FROM(Transact-SQL)
적용 대상: Microsoft Fabric의 Microsoft Fabric Warehouse에 있는 SQL Server 2022(16.x) Azure SQL Database Azure SQL Managed Instance SQL 분석 엔드포인트
두 식의 동등성을 비교하고 하나 또는 두 피연산자가 모두 NULL인 경우에도 true 또는 false 결과를 보장합니다.
IS [NOT] DISTINCT FROM은 WHERE 절 및 HAVING 절의 검색 조건, FROM 절의 조인 조건 및 부울 값이 필요한 기타 구문에 사용되는 조건자입니다.
구문
expression IS [NOT] DISTINCT FROM expression
인수
expression
유효한 식입니다.
이 식은 열, 상수, 함수, 변수, 스칼라 하위 쿼리이거나 열 이름, 상수 및 연산자나 하위 쿼리로 연결된 함수의 결합일 수 있습니다.
설명
NULL 값을 다른 NULL을 포함한 다른 값과 비교하면 알 수 없는 결과가 발생합니다. IS [NOT] DISTINCT FROM은 비교 연산자로 사용할 때 NULL 값을 알려진 값으로 처리하므로 항상 true 또는 false를 반환합니다.
다음 샘플 표에서는 A
및 B
값을 사용하고 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