복붙노트

[SQL] SQL의 행에 널 열 카운트

SQL

SQL의 행에 널 열 카운트

내가 SQL에서 행의 널 열을 계산 할 수있는 가능성에 대해 궁금 해서요, 내가 널 (NULL) 값이있는 테이블 고객이 단순히 내가 특정 행 (특정 고객)에 대한 널 열 수의 int를 반환하는 쿼리를 원한다.

해결법

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

    1.이 메소드는 null 컬럼에 대한 1 또는 0을 할당하고, 그들에게 모두 함께를 추가합니다. 희망 당신은 여기에 추가하는 너무 많은 널 (NULL) 컬럼이없는 ...

    이 메소드는 null 컬럼에 대한 1 또는 0을 할당하고, 그들에게 모두 함께를 추가합니다. 희망 당신은 여기에 추가하는 너무 많은 널 (NULL) 컬럼이없는 ...

    SELECT 
      ((CASE WHEN col1 IS NULL THEN 1 ELSE 0 END)
      + (CASE WHEN col2 IS NULL THEN 1 ELSE 0 END)
      + (CASE WHEN col3 IS NULL THEN 1 ELSE 0 END)
      ...
      ...
      + (CASE WHEN col10 IS NULL THEN 1 ELSE 0 END)) AS sum_of_nulls
    FROM table
    WHERE Customer=some_cust_id
    

    당신의 RDBMS 지원을하는 경우 참고, 당신은 또한 IF ()보다 문법적으로 깔끔하게이 아마 조금 할 수 있습니다.

    SELECT 
      (IF(col1 IS NULL, 1, 0)
      + IF(col2 IS NULL, 1, 0)
      + IF(col3 IS NULL, 1, 0)
      ...
      ...
      + IF(col10 IS NULL, 1, 0)) AS sum_of_nulls
    FROM table
    WHERE Customer=some_cust_id
    

    나는 테이블에 대해이 패턴을 테스트하고 제대로 작동하려면 나타납니다.

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

    2.내 대답은 마이클 Berkowski의 대답을 기반으로하지만, 피하기는 열 이름의 수백을 입력하는 데, 제가 한 일은이 있었다 :

    내 대답은 마이클 Berkowski의 대답을 기반으로하지만, 피하기는 열 이름의 수백을 입력하는 데, 제가 한 일은이 있었다 :

    1 단계 : 테이블의 모든 컬럼의 목록을 가져옵니다

    SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'myTable';
    

    2 단계 : ++ 메모장에서 목록을 붙여 넣기 (지원 정규 표현식 교체 작동합니다 어떤 편집기). 그런 다음이 교체 패턴을 사용

    3 단계 : 앞에 추가 SELECT identityColumnName, 그리고에 의해 주문을 추가 선택적 myTable에 FROM AS NullCount에 맨 마지막 +을 변경하고 ...

    SELECT 
        identityColumnName, 
        (CASE WHEN column001 IS NULL THEN 1 ELSE 0 END) +
        -- ...
        (CASE WHEN column200 IS NULL THEN 1 ELSE 0 END) AS NullCount
    FROM
        myTable
    ORDER BY 
        NullCount DESC
    
  3. ==============================

    3.오라클 DBMS에만 해당됩니다.

    오라클 DBMS에만 해당됩니다.

    당신은 NVL2 기능을 사용할 수 있습니다 :

    NVL2( string1, value_if_not_null, value_if_null )
    

    여기에 마이클 Berkowski 제안으로 비슷한 접근 방식을 선택할 수 있습니다 :

    SELECT (NVL2(col1, 0, 1) 
            + NVL2(col2, 0, 1)
            + NVL2(col3, 0, 1)
            ...
            ...
            + NVL2(col10, 0, 1)
            ) AS sum_of_nulls
    FROM table
    WHERE Customer=some_cust_id
    

    보다 일반적인 방법은 PL / SQL 블록 사용 동적 SQL을 작성하는 것입니다. 당신은 특정 테이블의 ALL_TAB_COLUMNS의 모든 컬럼에 대한 위의 NVL2 방법과 SELECT 문자열을 구축해야합니다.

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

    4.불행하게도, 표준 SQL 문에 모든 프로그래밍 방식은 T-SQL을 사용할 수 있습니다 테스트, 테스트 할 각 열을 입력해야합니다. 그러나 경고의 말씀이, 데이터베이스 진정한 NULL로 인식되지 않습니다 빈 저장된 값을 가질 수 있습니다, 당신은 진정한 null로 작동하고 있는지 (I 이상한이 소리를 알고있다).

    불행하게도, 표준 SQL 문에 모든 프로그래밍 방식은 T-SQL을 사용할 수 있습니다 테스트, 테스트 할 각 열을 입력해야합니다. 그러나 경고의 말씀이, 데이터베이스 진정한 NULL로 인식되지 않습니다 빈 저장된 값을 가질 수 있습니다, 당신은 진정한 null로 작동하고 있는지 (I 이상한이 소리를 알고있다).

    이 같은 성명에서 빈 값과 NULLS를 캡처하여이를 방지 할 수 있습니다 :

    CASE WHEN col1 & '' = '' THEN 1 ELSE 0 END
    

    또는 Oracle과 같은 일부 데이터베이스의 (하지 않도록 어떤 다른 사람이있는 경우)를 사용하는 것입니다 :

    CASE WHEN col1 || '' = '' THEN 1 ELSE 0 END
    
  5. ==============================

    5.당신은 RDBMS를 명시하지 않습니다. SQL Server 2008의 ...

    당신은 RDBMS를 명시하지 않습니다. SQL Server 2008의 ...

    SELECT CustomerId,
           (SELECT COUNT(*) - COUNT(C)
            FROM   (VALUES(CAST(Col1 AS SQL_VARIANT)),
                          (Col2),
                          /*....*/
                          (Col9),
                          (Col10)) T(C)) AS NumberOfNulls
    FROM   Customer  
    
  6. ==============================

    6.수행하려는 작업에 따라, 당신은 달인을 무시한다면, 당신은 2012 SQL 서버를 사용하는 경우, 당신은 다른 방법으로 그것을 할 수 있었다. .

    수행하려는 작업에 따라, 당신은 달인을 무시한다면, 당신은 2012 SQL 서버를 사용하는 경우, 당신은 다른 방법으로 그것을 할 수 있었다. .

    후보 컬럼의 총 수는 ( "슬롯")를 알고 있어야합니다.  열을 기준으로 모든 알려진 "슬롯"열을 선택합니다 (그들은 알려진 것).  를 얻기 위해 결과 2. 피벗 해제     원본 항목 당 하나의 행 테이블. 널 열이 없기 때문에이 작품     UNPIVOT, 당신은 모두에게 열 이름을 알고있다.  3. 카운트 (*) 비 - 널의 수를 얻을 수있는 결과;     답을 얻기 위해 그에서 뺍니다.

    이와 같이, 자동차 4 "석"에 대한

    select 'empty seats' = 4 - count(*)
    from 
    (
        select carId, seat1,seat2,seat3,seat4 from cars where carId = @carId
    ) carSpec
    unpivot (FieldValue FOR seat in ([seat1],[seat2],[seat3],[seat4])) AS results
    

    단지 null이 아닌 컬럼의 수를 세는 것보다 당신에게 너무 세트로 열을 조작 할 수있는 방법을 제공합니다 당신이 더 이상 수행해야 할 수 있습니다 경우에 유용합니다.

  7. ==============================

    7.이렇게하면 널 (null)가 아닌 컬럼의 수를 줄 것이다. 당신은 적절하게이 문제를 적용 할 수 있습니다

    이렇게하면 널 (null)가 아닌 컬럼의 수를 줄 것이다. 당신은 적절하게이 문제를 적용 할 수 있습니다

    SELECT   ISNULL(COUNT(col1),'') + ISNULL(COUNT(col2),'') +ISNULL(COUNT(col3),'') 
       FROM TABLENAME
       WHERE  ID=1
    
  8. ==============================

    8.스크립트 아래는 행 즉, 값이없는 얼마나 많은 열을 내 당신에게 NULL 값의 수를 제공합니다.

    스크립트 아래는 행 즉, 값이없는 얼마나 많은 열을 내 당신에게 NULL 값의 수를 제공합니다.

    {SELECT
        *,
        (SELECT COUNT(*)
        FROM (VALUES (Tab.Col1)
                    ,(Tab.Col2)
                    ,(Tab.Col3)
                    ,(Tab.Col4)) InnerTab(Col) 
            WHERE Col IS NULL) NullColumnCount
    FROM (VALUES(1,2,3,4)
                ,(NULL,2,NULL,4)
                ,(1,NULL,NULL,NULL)) Tab(Col1,Col2,Col3,Col4) } 
    

    그냥 내 예제에서 인라인 테이블을 사용하고 설명합니다.

    캐스트로 시도하거나 당신이 다른 유형의 열을 비교하는 데 도움이 될 것입니다 일반적인 유형에 모든 열 값을 변환합니다.

  9. ==============================

    9.나는 아직 테스트하지 않은,하지만 난 PL \ SQL 함수를 사용하여 수행하려고 할 것

    나는 아직 테스트하지 않은,하지만 난 PL \ SQL 함수를 사용하여 수행하려고 할 것

    CREATE OR REPLACE TYPE ANYARRAY AS TABLE OF ANYDATA
    ;
    
    CREATE OR REPLACE Function COUNT_NULL
    ( ARR IN ANYARRAY )
    RETURN number
    IS
       cnumber number ;
    BEGIN
    
       for i in 1 .. ARR.count loop
         if ARR(i).column_value is null then
           cnumber := cnumber + 1;
         end if;
       end loop;
    
    RETURN cnumber;
    
    EXCEPTION
    WHEN OTHERS THEN
       raise_application_error
       (-20001,'An error was encountered - '
       ||SQLCODE||' -ERROR- '||SQLERRM);
    END
    ;
    

    다음과 같은 선택 쿼리에서 사용

    CREATE TABLE TEST (A NUMBER, B NUMBER, C NUMBER);
    
    INSERT INTO TEST (NULL,NULL,NULL);
    INSERT INTO TEST (1   ,NULL,NULL);
    INSERT INTO TEST (1   ,2   ,NULL);
    INSERT INTO TEST (1   ,2   ,3   );
    
    SELECT ROWNUM,COUNT_NULL(A,B,C) AS NULL_COUNT FROM TEST;
    

    예상 출력

    ROWNUM | NULL_COUNT
    -------+-----------
         1 | 3
         2 | 2
         3 | 1
         4 | 0
    
  10. ==============================

    10.이것은 내가 시도하는 방법이다

    이것은 내가 시도하는 방법이다

    CREATE TABLE #temptablelocal (id int NOT NULL, column1 varchar(10) NULL, column2 varchar(10) NULL, column3 varchar(10) NULL, column4 varchar(10) NULL, column5 varchar(10) NULL, column6 varchar(10) NULL);
    
    
    INSERT INTO #temptablelocal
    VALUES (1,
            NULL,
            'a',
            NULL,
            'b',
            NULL,
            'c')
    SELECT *
    FROM #temptablelocal
    WHERE id =1
      SELECT count(1) countnull
      FROM
        (SELECT a.ID,
                b.column_title,
                column_val = CASE b.column_title    
                WHEN 'column1' THEN a.column1 
                WHEN 'column2' THEN a.column2 
                WHEN 'column3' THEN a.column3 
                WHEN 'column4' THEN a.column4 
                WHEN 'column5' THEN a.column5 
                WHEN 'column6' THEN a.column6 
                END
         FROM
           ( SELECT id,
                    column1,
                    column2,
                    column3,
                    column4,
                    column5,
                    column6
            FROM #temptablelocal
            WHERE id =1 ) a
         CROSS JOIN
           ( SELECT 'column1'
            UNION ALL SELECT 'column2'
            UNION ALL SELECT 'column3'
            UNION ALL SELECT 'column4'
            UNION ALL SELECT 'column5'
            UNION ALL SELECT 'column6' ) b (column_title) ) AS pop WHERE column_val IS NULL
      DROP TABLE #temptablelocal
    

  11. ==============================

    11.유사하지만, 동적 :

    유사하지만, 동적 :

    drop table if exists myschema.table_with_nulls;
    
    create table myschema.table_with_nulls as
    
    select 
       n1::integer,
       n2::integer,
       n3::integer,
       n4::integer,
       c1::character varying,
       c2::character varying,
       c3::character varying,
       c4::character varying
    from 
       (
          values 
             (1,2,3,4,'a','b','c','d'),
             (1,2,3,null,'a','b','c',null),
             (1,2,null,null,'a','b',null,null),
             (1,null,null,null,'a',null,null,null)
       ) as test_records(n1, n2, n3, n4, c1, c2, c3, c4);
    
    
    drop function if exists myschema.count_nulls(varchar,varchar);
    
    create function myschema.count_nulls(schemaname varchar, tablename varchar) returns void as 
    $BODY$
       declare
          calc varchar;
          sqlstring varchar;
    begin
       select
          array_to_string(array_agg('(' || trim(column_name) || ' is null)::integer'),' + ') 
       into
          calc
       from
          information_schema.columns
       where 
          table_schema in ('myschema') 
             and table_name in ('table_with_nulls'); 
    
       sqlstring = 'create temp view count_nulls as select *, ' || calc || '::integer as count_nulls from myschema.table_with_nulls';
    
       execute sqlstring;
    
       return;
    end;
    $BODY$ LANGUAGE plpgsql STRICT;
    
    select * from myschema.count_nulls('myschema'::varchar,'table_with_nulls'::varchar);
    
    
    select
       *
    from 
       count_nulls;
    

    나는 기능을 parametising 완료되지 않은 것을 볼 수 있지만.

  12. ==============================

    12.내 대답은 드류 채핀의 대답에,하지만 피할 단계 과정을 할 필요 단지 하나의 쿼리 실행에 빌드 :

    내 대답은 드류 채핀의 대답에,하지만 피할 단계 과정을 할 필요 단지 하나의 쿼리 실행에 빌드 :

    use <add_database_here>;
    Declare @val Varchar(MAX); 
    
    Select @val = COALESCE(@val + str, str) From 
        (SELECT
        '(CASE WHEN '+COLUMN_NAME+' IS NULL THEN 1 ELSE 0 END) +' str
        FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '<add table name here>'
        ) t1 -- getting column names and adding the case when to replace NULLs for zeros or ones
    
    Select @val = SUBSTRING(@val,1,LEN(@val) - 1) -- removing trailling add sign
    
    Select @val = 'SELECT <add_identity_column_here>, ' + @val + ' AS NullCount FROM <add table name here>' -- adding the 'select' for the column identity, the 'alias' for the null count column, and the 'from'
    
    EXEC (@val) --executing the resulting sql
    
  13. ==============================

    13.계산 행에있을 것 같은 일을하는 간단한 방법이 없습니다. 기본적으로, 당신은 하나 개의 표현에 널 (null)이 될 수있는 모든 열을 열거합니다.

    계산 행에있을 것 같은 일을하는 간단한 방법이 없습니다. 기본적으로, 당신은 하나 개의 표현에 널 (null)이 될 수있는 모든 열을 열거합니다.

    null의 가능성이있는 열이있는 테이블에 대한 그래서 A, B는 C, 당신은이 작업을 수행 할 수 있습니다 :

    SELECT key_column, COALESCE(a,0) + COALESCE(b,0) + COALESCE(c,0) null_col_count
      FROM my_table
    
  14. from https://stackoverflow.com/questions/8596500/count-the-null-columns-in-a-row-in-sql by cc-by-sa and MIT license