Count the Null columns in a row in SQL

后端 未结 13 721
小蘑菇
小蘑菇 2020-11-30 04:36

I was wondering about the possibility to count the null columns of row in SQL, I have a table Customer that has nullable values, simply I want a query that return an int of

相关标签:
13条回答
  • 2020-11-30 05:22

    There isn't a straightforward way of doing so like there would be with counting rows. Basically, you have to enumerate all the columns that might be null in one expression.

    So for a table with possibly null columns a, b, c, you could do this:

    SELECT key_column, COALESCE(a,0) + COALESCE(b,0) + COALESCE(c,0) null_col_count
      FROM my_table
    
    0 讨论(0)
  • 2020-11-30 05:28

    You don't state RDBMS. For 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  
    
    0 讨论(0)
  • 2020-11-30 05:30

    Depending on what you want to do, and if you ignore mavens, and if you use SQL Server 2012, you could to it another way. .

    The total number of candidate columns ("slots") must be known. 1. Select all the known "slots" column by column (they're known). 2. Unpivot that result to get a table with one row per original column. This works because the null columns don't unpivot, and you know all the column names. 3. Count(*) the result to get the number of non-nulls; subtract from that to get your answer.

    Like this, for 4 "seats" in a car

    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
    

    This is useful if you may need to do more later than just count the number of non-null columns, as it gives you a way to manipulate the columns as a set too.

    0 讨论(0)
  • 2020-11-30 05:33

    Unfortunately, in a standard SQL statement you will have to enter each column you want to test, to test all programatically you could use T-SQL. A word of warning though, ensure you are working with genuine NULLS, you can have blank stored values that the database will not recognise as a true NULL (I know this sounds strange).

    You can avoid this by capturing the blank values and the NULLS in a statement like this:

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

    Or in some databases such as Oracle (not sure if there are any others) you would use:

    CASE WHEN col1 || '' = '' THEN 1 ELSE 0 END
    
    0 讨论(0)
  • 2020-11-30 05:34

    This will give you the number of columns which are not null. you can apply this appropriately

    SELECT   ISNULL(COUNT(col1),'') + ISNULL(COUNT(col2),'') +ISNULL(COUNT(col3),'') 
       FROM TABLENAME
       WHERE  ID=1
    
    0 讨论(0)
  • 2020-11-30 05:35

    For ORACLE-DBMS only.

    You can use the NVL2 function:

    NVL2( string1, value_if_not_null, value_if_null )
    

    Here is a select with a similiar approach as Michael Berkowski suggested:

    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
    

    A more generic approach would be to write a PL/SQL-block and use dynamic SQL. You have to build a SELECT string with the NVL2 method from above for every column in the all_tab_columns of a specific table.

    0 讨论(0)
提交回复
热议问题