복붙노트

[SQL] 경고를 얻기 : Null 값이 집계 또는 다른 SET 연산에 의해 제거

SQL

경고를 얻기 : Null 값이 집계 또는 다른 SET 연산에 의해 제거

나는이 스키마를

create table t(id int, d date) 

insert into t (id, d) values (1, getdate()), 
                             (2, NULL)

수행 할 때

declare @mindate date    
select @mindate = min(d) from t

나는 경고를

나는 그것에 대해 무엇을 왜 등을 할 수 있습니까?

해결법

  1. ==============================

    1.당신은 또한 그것에 대해 아무것도 할 수 있습니다.

    당신은 또한 그것에 대해 아무것도 할 수 있습니다.

    그것은 SQL 표준에서 요구 단지 정보 메시지입니다. 그것은 (이 점에서 더 나은 실행 계획을 제공하지 않습니다 경고를 단지 NULL 행을 읽는 바이 패스 SQL Server가 오버 헤드를 가질 수 할 수없는 것을 의미하지만, 사용 불가능하게하는 것 이외의 다른) 어떤 부작용이 없습니다

    이 메시지를 반환하는 이유는 SQL 널 (null) 전파에서 대부분의 작업 전반에 걸쳐.

    SELECT NULL + 3 개 + 7 개 반환 NULL (? + 3 + 7도 알 수로서이 차종이 감지 알 수없는 수량으로 NULL에 대한)

    그러나

    SELECT SUM(N)
    FROM   (VALUES (NULL),
                   (3),
                   (7)) V(N) 
    

    반환 (10)와 널 (null)이 무시되었다는 경고.

    그러나이 정확히 전형적인 집계 쿼리에 대한 당신이 원하는 의미입니다. 모든 행은 항상 매우 유용하지 않습니다 산출 NULL을 끝낼 것 이상 그렇지 않으면 하나의 NULL의 존재는 해당 컬럼에 대한 집계를 의미 할 것입니다.

    아래의 무거운 케이크는 무엇입니까? (이미지 출처, 풍경, Photo 이미지 내게로) (변경 자른 및 주석)

    세 번째 케이크 무게 후 비늘이 파산하고 그래서 정보는 네번째에 대해 사용할 수 없습니다하지만 둘레를 측정하는 것은 여전히 ​​가능했다.

    +--------+--------+---------------+
    | CakeId | Weight | Circumference |
    +--------+--------+---------------+
    |      1 | 50     | 12.0          |
    |      2 | 80     | 14.2          |
    |      3 | 70     | 13.7          |
    |      4 | NULL   | 13.4          |
    +--------+--------+---------------+
    

    쿼리

    SELECT MAX(Weight)        AS MaxWeight,
           AVG(Circumference) AS AvgCircumference
    FROM   Cakes 
    

    보고

    +-----------+------------------+
    | MaxWeight | AvgCircumference |
    +-----------+------------------+
    |        80 |          13.325  |
    +-----------+------------------+
    

    비록 기술적으로 위의 결과는 일반적으로 단지 알려지지 복귀보다 유용하다 (미지의 수가 클 수 있으므로) (80)가 무거운 케이크의 중량이라고 확실하게 말할 수 없다.

    +-----------+------------------+
    | MaxWeight | AvgCircumference |
    +-----------+------------------+
    |         ? |          13.325  |
    +-----------+------------------+
    

    그래서 아마 당신은 NULL을 무시하려는 및 경고는 이런 일이 있다는 사실을 알려줍니다.

  2. ==============================

    2.@juergen 두 개의 좋은 답변을 제공 :

    @juergen 두 개의 좋은 답변을 제공 :

    그러나 당신은 D 열이 널 (null) 한 다음 D가 너무로 null로 설정되어있는 모든 행을 제외하여이 작업을 수행 할 수있는 ANSI_WARNINGS 옵션이없는 문제를 직접입니다 행을 무시하려는 경우 :

    select @mindate = min(d) from t where (d IS NOT NULL)
    
  3. ==============================

    3.난 당신이 MIN 기능을 사용하기 때문에 당신이 경우에이 경고를 무시할 수 있다고 생각합니다.

    난 당신이 MIN 기능을 사용하기 때문에 당신이 경우에이 경고를 무시할 수 있다고 생각합니다.

    "COUNT를 제외하고 집계 함수가 null 값을 무시"

  4. ==============================

    4.() D의 가장 낮은 값으로 귀하의 경우 반환 무엇을 min해야합니까?

    () D의 가장 낮은 값으로 귀하의 경우 반환 무엇을 min해야합니까?

    이 오류는 분 () 함수가 null의 계정에 기록을하지 않았 음을 알려줍니다.

    는 NULL 값을 무시하고 가장 낮은 기존의 날짜를 반환해야합니다 그래서 만약 당신이 경고를 무시할 수 있습니다.

    당신이 하나의 명령문에 대한 억제 경고에처럼 당신은 이런 식으로 할 수 있다면

    set ansi_warnings off
    select @mindate = min(d) from t
    set ansi_warnings on
    

    당신은 NULL 값이이 값의 기본값을 사용하여 고려하려는 경우, 당신은이 같은 기본 날짜 값을 설정할 수 있습니다

    select @mindate = min(isnull(d, cast(0 as datetime)))
    from t
    
  5. ==============================

    5.당신은 집계가 null 값을 고려하고 사용할 수있는 널 (null)로 결과를 처리 확인하려면 :

    당신은 집계가 null 값을 고려하고 사용할 수있는 널 (null)로 결과를 처리 확인하려면 :

    SELECT IIF(COUNT(N) != COUNT(*), NULL, SUM(N)) as [Sum]
    FROM   (VALUES (NULL),
                   (3),
                   (7)) V(N) 
    

    모든 값이 주어진 경우 NULL을 반환합니다.

  6. from https://stackoverflow.com/questions/18719436/getting-warning-null-value-is-eliminated-by-an-aggregate-or-other-set-operation by cc-by-sa and MIT license