[sql] SQL Server 쿼리에서 NULL을 0으로 대체

쿼리를 개발했으며 처음 세 열의 결과에서을 얻었습니다 NULL. 그것을 어떻게 대체 할 수 0있습니까?

  Select c.rundate,
    sum(case when c.runstatus = 'Succeeded' then 1 end) as Succeeded,
    sum(case when c.runstatus = 'Failed' then 1 end) as Failed,
    sum(case when c.runstatus = 'Cancelled' then 1 end) as Cancelled,
    count(*) as Totalrun from
    (    Select a.name,case when b.run_status=0 Then 'Failed' when b.run_status=1 Then 'Succeeded'
    when b.run_status=2 Then 'Retry' Else 'Cancelled' End as Runstatus,
    ---cast(run_date as datetime)
                cast(substring(convert(varchar(8),run_date),1,4)+'/'+substring(convert(varchar(8),run_date),5,2)+'/'          +substring(convert(varchar(8),run_date),7,2) as Datetime) as RunDate
    from msdb.dbo.sysjobs as a(nolock) inner join msdb.dbo.sysjobhistory as b(nolock)
    on a.job_id=b.job_id
    where a.name='AI'
    and b.step_id=0) as c
    group by
    c.rundate



답변

가능한 null열을 다른 것으로 바꾸려면 IsNull을 사용하십시오 .

SELECT ISNULL(myColumn, 0 ) FROM myTable

처음에는 null이면 myColumn에 0을 넣습니다.


답변

이 두 가지 방법을 모두 사용할 수 있지만 차이점이 있습니다.

SELECT ISNULL(col1, 0 ) FROM table1
SELECT COALESCE(col1, 0 ) FROM table1

COALESCE ()와 ISNULL () 비교 :

  1. ISNULL 함수와 COALESCE 표현식의 목적은 비슷하지만 다르게 동작 할 수 있습니다.

  2. ISNULL은 함수이므로 한 번만 평가됩니다. 위에서 설명한 것처럼 COALESCE 표현식의 입력 값은 여러 번 평가 될 수 있습니다.

  3. 결과 표현식의 데이터 유형 결정이 다릅니다. ISNULL은 첫 번째 매개 변수의 데이터 유형을 사용하고 COALESCE는 CASE 표현식 규칙을 따르고 우선 순위가 가장 높은 값의 데이터 유형을 리턴합니다.

  4. ISNULL 및 COALESCE에 대한 결과 표현식의 NULL 가능성이 다릅니다. 널 (NULL)이 아닌 매개 변수가있는 COALESCE는 널 (NULL)로 간주되는 반면, ISNULL 리턴 값은 항상 널 (NULL) 입력 가능하지 않은 것으로 간주됩니다 (복귀 값이 널이 아닌 것으로 가정). 따라서 ISNULL (NULL, 1) 및 COALESCE (NULL, 1) 식은 서로 다른 Null 허용 값을 갖습니다. 계산 된 열에서 이러한 표현식을 사용하거나 키 제한 조건을 작성하거나 스칼라 UDF의 리턴 값을 결정하여 다음 예제와 같이 인덱싱 할 수 있으면 차이가 있습니다.

-PRIMARY KEY가 NULL 값을 승인 할 수없고 col2에 대한 COALESCE 표현식의 널 입력 가능 여부가 NULL로 평가되므로이 명령문은 실패합니다.

CREATE TABLE #Demo
(
    col1 integer NULL,
    col2 AS COALESCE(col1, 0) PRIMARY KEY,
    col3 AS ISNULL(col1, 0)
); 

-ISNULL 함수의 Null 허용 여부는 AS NOT NULL로 평가되므로이 명령문은 성공합니다.

CREATE TABLE #Demo
(
    col1 integer NULL,
    col2 AS COALESCE(col1, 0),
    col3 AS ISNULL(col1, 0) PRIMARY KEY
);
  1. ISNULL 및 COALESCE에 대한 유효성 검사도 다릅니다. 예를 들어, ISNULL의 NULL 값은 int로 변환되는 반면 COALESCE의 경우 데이터 유형을 제공해야합니다.

  2. ISNULL은 2 개의 매개 변수 만 사용하고 COALESCE는 가변적 인 수의 매개 변수를 사용합니다.

    더 자세한 정보가 필요하면 msdn 의 전체 문서 를 참조 하십시오 .


답변

coalesce:

coalesce(column_name,0)

합산 곳,하지만 when condition then 1, 당신은 쉽게 바꿀 수 sumcount– 예 :

count(case when c.runstatus = 'Succeeded' then 1 end) as Succeeded,

( Count(null)0을 sum(null)반환하고 null 을 반환합니다.)


답변

처음 세 열을 말할 때 열을 의미 SUM합니까? 그렇다면, ELSE 0당신의 CASE진술에 추가 하십시오 . SUM(A)의 NULL값이다 NULL.

sum(case when c.runstatus = 'Succeeded' then 1 else 0 end) as Succeeded,
sum(case when c.runstatus = 'Failed' then 1 else 0 end) as Failed,
sum(case when c.runstatus = 'Cancelled' then 1 else 0 end) as Cancelled, 

답변

간단한 방법은

UPDATE tbl_name SET fild_name = value WHERE fild_name IS NULL


답변

이 코드로 열을 감싸십시오.

 ISNULL(Yourcolumn, 0)

어쩌면 왜 null을 받고 있는지 확인하십시오.


답변

COALESCE첫 번째 null이 아닌 값을 반환하는 Use

SELECT COALESCE(sum(case when c.runstatus = 'Succeeded' then 1 end), 0) as Succeeded

로 반환되면 성공을 0으로 설정 NULL합니다.