ISNULL을 사용하는 것과 COALESCE를 사용하여 특정 조건을 확인합니까?
여러 매개 변수를에 전달할 수 있다는 것을 알고 COALESCE
있지만 하나의 표현식 만 존재하지 않는지 확인하려면 기본값을 사용 ISNULL
합니까 아니면 대신 사용하는 것이 더 나은 방법 입니까?
둘 사이에 성능 향상이 있습니까?
연결 Microsoft에보고 된이 문제는 몇 가지 차이점 계시 COALESCE
과 ISNULL
:
우리의 처리의 초기 부분은 재기록
COALESCE( expression1, expression2 )
로CASE WHEN expression1 IS NOT NULL THEN expression1 ELSE expression2 END
. [이 예]에서 :COALESCE ( ( SELECT Nullable FROM Demo WHERE SomeCol = 1 ), 1 )
우리는 다음을 생성합니다.
SELECT CASE WHEN (SELECT Nullable FROM Demo WHERE SomeCol = 1) IS NOT NULL THEN (SELECT Nullable FROM Demo WHERE SomeCol = 1) ELSE 1 END
쿼리 처리의 나중 단계에서는 두 하위 쿼리가 원래 동일한 표현식이라는 것을 이해하지 못하므로 하위 쿼리를 두 번 실행합니다.
한 가지 해결 방법 은 후자가 하위 쿼리를 복제하지 않기 때문에 으로 변경
COALESCE
하는 것ISNULL
입니다.
나는 그렇지 않다고 생각하지만 COALESCE는 SQL '92 표준에 있으며 더 많은 다른 데이터베이스에서 지원됩니다. 이식성을 원한다면 ISNULL을 사용하지 마십시오.
COALESCE 에서는 여러 표현식을 가질 수 있으며, ISNULL 에서는 하나의 표현식 만 확인할 수 있습니다.
COALESCE ( expression [ ,...n ] )
ISNULL ( check_expression , replacement_value )
언급 할 가치가있는 것은 둘 사이의 유형 처리도 차이를 만들 수 있다는 것입니다 ( 이 관련 답변 항목 (2) 참조 ).
쿼리가 null 비교를 작성하기 위해 바로 가기를 사용하려고한다고 가정합니다.
select * from SomeTable
where IsNull(SomeNullableBitField, -1) != IsNull(SomeOtherNullableBitField, -1);
그것은 다른
select * from SomeTable
where coalesce(SomeNullableBitField, -1) != coalesce(SomeOtherNullableBitField, -1);
첫 번째 경우에는 IsNull ()이 형식을 비트 (따라서 -1이 true로 변환 됨)가되도록 강제하는 반면 두 번째 경우는 둘 다 int로 승격합니다.
with input as
(
select convert(bit, 1) as BitOn,
convert(bit, 0) as BitOff,
convert(bit, null) as BitNull
)
select BitOn,
BitOff,
BitNull,
IsNull(BitOn, -1) IsNullBitOn, -- true
IsNull(BitOff, -1) IsNullBitOff, -- false
IsNull(BitNull, -1) IsNullBitNull, -- true, converts the -1 to bit
coalesce(BitOn, -1) CoalesceBitOn, -- 1
coalesce(BitOff, -1) CoalesceBitOff, -- 0
coalesce(BitNull, -1) CoalesceBitNull -- -1
from input;
질문 자체에 대한 유사한 댓글 / 링크 (@Martin Smith)가 있습니다.
내가 명시 적으로 표시하지 않는 한 가지 중요한 점은 ISNULL
의 출력 유형이 첫 번째 표현식과 유사하지만 COALESCE
우선 순위가 가장 높은 값의 데이터 유형을 반환한다는 것입니다.
DECLARE @X VARCHAR(3) = NULL
DECLARE @Y VARCHAR(10) = '123456789'
/* The datatype returned is similar to X, or the first expression*/
SELECT ISNULL(@X, @Y) ---> Output is '123'
/* The datatype returned is similar to Y, or to the value of highest precedence*/
SELECT COALESCE(@X, @Y) ---> Output is '123456789'
null 조건이 하나만 ISNULL
있는 경우 오버 헤드가 적습니다. 그러나 그 차이는 아마도 무시할 만합니다.
이 설명은 통합 대 isnull에 대해 명확하게 설명합니다.
SQL의 COALESCE 함수는 인수 중 NULL이 아닌 첫 번째 표현식을 리턴합니다. COALESCE의 구문은 다음과 같습니다.
COALESCE ("expression 1", "expressions 2", ...)
다음 CASE 문과 동일합니다.
SELECT CASE ("column_name")
WHEN "expression 1 is not NULL" THEN "expression 1"
WHEN "expression 2 is not NULL" THEN "expression 2"
...
[ELSE "NULL"]
END
FROM "table_name";
SQL Server에서 ISNULL () 함수는 NULL 값을 다른 값으로 바꾸는 데 사용됩니다.
select CountryName = ISNULL("columnname", 'INDIA') from Countries
Coalesce는 null 값을 원하는 값으로 바꾸는 데 isnull ()이 사용되는 첫 번째 null이 아닌 표현식을 반환합니다.
COALESCE는 ANSI 표준의 일부이며 거의 모든 데이터베이스에서 사용할 수 있습니다.
ISNULL v COALESCE 사이를 결정할 때 매개 변수를주의해야합니다.
- COALESCE는 데이터 유형 우선 순위에 따라 출력 유형을 결정합니다. 여기서 ISNULL을 사용하면 데이터 유형이 데이터 유형 우선 순위에 영향을받지 않습니다.
다음 SQL 문 고려
DECLARE @c5 VARCHAR(5); SELECT 'COALESCE', COALESCE(@c5, 'longer name') UNION ALL SELECT 'ISNULL', ISNULL(@c5, 'longer name');
결과 :
COALESCE longer name
ISNULL longe
이는 ISNULL이 첫 번째 인수의 데이터 유형을 취하고 COALESCE가 모든 요소를 검사하고 가장 적합한 것을 선택하기 때문에 발생합니다 (이 경우 VARCHAR (11)).
COALESCE와 ISNULL 사이의 결정에 대한 자세한 설명은 https://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/를 확인하십시오.
NULL
와는 COALESCE
항상 서로 호환되지 않습니다. 다른 하나를 사용하는 것이 더 좋은 때를 알기 위해 차이점을 알아야합니다.
위의 표는 사이 비교 한 ISNULL
과 COALESCE
에서 Exam Ref 70-761 Querying Data with Transact-SQL
Itzik 벤 웨이 코 뮤니시가 쓴 책.
- 지원되는 매개 변수
2
수ISNULL
-for vs>2
when usingCOALESCE
ISNULL
독점 T-SQL 기능이며COALESCE
ISO / ANSI SQL 표준입니다.결과의 데이터 유형이 중요합니다. 위 표의 메모를 읽은 후 다음 사례를 확인하십시오.
DECLARE @x VARCHAR(3) = NULL ,@y VARCHAR(10) = '1234567890'; SELECT ISNULL(@x, @y) AS [ISNULL], COALESCE(@x, @y) AS [COALESCE];
는
ISNULL
그것이 아니므로 첫번째 인수의 데이터 유형을 받고NULL
문자. 그것은이다VARCHAR(3)
번째 인수의 데이터가 일치하도록 절단, 그 결과입니다. 로COALESCE
데이터 유형 가장 높은 우선 순위를 사용하는 경우.DECLARE @x VARCHAR(8) = '123x5' ,@y INT = 123; SELECT ISNULL(@x, @y) AS [ISNULL]; SELECT COALESCE(@x, @y) AS [COALESCE];
The
ISNULL
is returning the data type of first argument, while inCOALESCE
we are getting error, as theINT
has highest precedence and the conversion of the first argument value toINT
fails.The nullability of the result can be important, too. For, example:
DECLARE @x VARCHAR(3) = NULL ,@y VARCHAR(3) = NULL; DROP TABLE IF EXISTS [dbo].[DataSource01]; SELECT ISNULL(10, 20) AS [C1] ,ISNULL(@x, 'text') AS [C2] ,ISNULL(@x, @y) AS [C3] INTO [dbo].[DataSource01]; DROP TABLE IF EXISTS [dbo].[DataSource02]; SELECT COALESCE(10, 20) AS [C1] ,COALESCE(@x, 'text') AS [C2] ,COALESCE(@x, @y) AS [C3] INTO [dbo].[DataSource02];
Let's check the
Nullable
property of each column:Using
COALESCE
we have aNOT NULL
property of column set toYes
, only when all of the inputs are non null-able.According to the SQL standard, the
COALESCE
expression is translated to:CASE WHEN (<subquery>) IS NOT NULL THEN (<subquery>) ELSE 0 END
If the result of the execution of the subquery in the WHEN clause isn’t NULL, SQL Server executes it a second time in the THEN clause. In other words, in such a case it executes it twice. Only if the result of the execution in the WHEN clause is NULL, SQL Server doesn’t execute the subquery again, rather returns the ELSE expression. So when using subqueries, the ISNULL function has a performance advantage.
In COALESCE one can use multiple expressions, It will return value which is not a null and occurs first... for example
DECLARE @Value1 INT, @Value2 INT, @Value3 INT, @Value4 INT
SELECT @Value2 = 2, @Value4 = 4
SELECT COALESCE(@Value1, @Value2, @Value3, @Value4)
SELECT COALESCE(@Value1, @Value4, @Value3, @Value2)
And in ISNULL if expression null it will return second parameter provided, and of course you can check only for one expression...
So if want check multiple expression and select first not null among them, then use coalesce otherwise go for ISNULL
'IT박스' 카테고리의 다른 글
iOS에서 "뒤로"탐색 단추 동작 처리 시도 (0) | 2020.10.31 |
---|---|
git 설명 파일에 무엇이 있어야합니까? (0) | 2020.10.30 |
다른 CSS 클래스 내의 CSS 클래스를 대상으로 지정 (0) | 2020.10.30 |
std :: thread가 여전히 실행 중인지 확인하는 방법은 무엇입니까? (0) | 2020.10.30 |
조각보기가 사용자에게 표시되는지 테스트하는 방법은 무엇입니까? (0) | 2020.10.30 |