IT박스

ISNULL을 사용하는 것과 COALESCE를 사용하여 특정 조건을 확인합니까?

itboxs 2020. 10. 30. 07:51
반응형

ISNULL을 사용하는 것과 COALESCE를 사용하여 특정 조건을 확인합니까?


여러 매개 변수를에 전달할 수 있다는 것을 알고 COALESCE있지만 하나의 표현식 만 존재하지 않는지 확인하려면 기본값을 사용 ISNULL합니까 아니면 대신 사용하는 것이 더 나은 방법 입니까?

둘 사이에 성능 향상이 있습니까?


연결 Microsoft에보고 된이 문제는 몇 가지 차이점 계시 COALESCEISNULL:

우리의 처리의 초기 부분은 재기록 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 사이를 결정할 때 매개 변수를주의해야합니다.

  1. COALESCE는 데이터 유형 우선 순위에 따라 출력 유형을 결정합니다. 여기서 ISNULL을 사용하면 데이터 유형이 데이터 유형 우선 순위에 영향을받지 않습니다.
  2. 다음 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항상 서로 호환되지 않습니다. 다른 하나를 사용하는 것이 더 좋은 때를 알기 위해 차이점을 알아야합니다.

여기에 이미지 설명 입력

위의 표는 사이 비교 한 ISNULLCOALESCE에서 Exam Ref 70-761 Querying Data with Transact-SQLItzik 벤 웨이 코 뮤니시가 쓴 책.


  1. 지원되는 매개 변수 2ISNULL-for vs >2when usingCOALESCE
  2. ISNULL독점 T-SQL 기능이며 COALESCEISO / ANSI SQL 표준입니다.
  3. 결과의 데이터 유형이 중요합니다. 위 표의 메모를 읽은 후 다음 사례를 확인하십시오.

    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 in COALESCE we are getting error, as the INT has highest precedence and the conversion of the first argument value to INT fails.

  4. 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 a NOT NULL property of column set to Yes, only when all of the inputs are non null-able.

  5. 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

참고 URL : https://stackoverflow.com/questions/7408893/using-isnull-vs-using-coalesce-for-checking-a-specific-condition

반응형