OraQA

Oracle Question and Answer

  • Do you have a solution to a problem? Do you have an unanswered question? Login and share it with the Oracle community. More...

Oracle News


Entries RSS feed

Comments RSS feed

How to collapse all nulls for every table column in a SQL statement

February 13th, 2007 By Frank Zhou

The following SQL query pattern can be used to collapse all nulls for every table column in a SQL statement.

CREATE table t5 as
SELECT  1 as ID, 'A' as A, to_char(null) as B, 'C' as C , to_char(null) as D
FROM    dual
UNION ALL
SELECT  2, to_char(null), 'B', to_char(null) as C ,'D'
FROM    dual
UNION ALL
SELECT  3, 'A1', to_char(null) as B, to_char(null) as C, 'D1'
FROM    dual
UNION ALL
SELECT 4, to_char(null) as A ,'B1', 'C1', to_char(null) as D
FROM dual;

SELECT * FROM t5;

        ID A  B  C  D
---------- -- -- -- --
         1 A     C
         2    B     D
         3 A1       D1
         4    B1 C1       

SELECT  MAX(A) AS A,
        MAX(B) AS B,
        MAX(C) AS C,
        MAX(D) AS D
FROM
        (SELECT row_number( ) OVER (PARTITION BY LEV ORDER BY ID) AS rn,
                lev,
                A,
                B,
                C,
                D
        FROM    t5,(SELECT LEVEL lev FROM dual CONNECT BY LEVEL <=4)
        WHERE
                CASE
                        WHEN    Lev = 1
                        THEN    A
                        WHEN    Lev = 2
                        THEN    B
                        WHEN    Lev = 3
                        THEN    C
                        WHEN    Lev = 4
                        THEN    D
                END IS NOT NULL
        )
GROUP BY RN;

A  B  C  D
-- -- -- --
A  B  C  D
A1 B1 C1 D1

One Response to “How to collapse all nulls for every table column in a SQL statement”

  1. newkid Says:
    If I change your data a little bit:
    CREATE table t5 as
    SELECT  1 as ID, 'A' as A, to_char(null) as B, 'C' as C , to_char(null) as D
    FROM    dual
    UNION ALL
    SELECT  2, to_char(null), 'B', to_char(null) as C ,'D'
    FROM    dual
    UNION ALL
    SELECT  3, 'A1', 'A' as B, to_char(null) as C, 'D1'
    FROM    dual
    UNION ALL
    SELECT 4, to_char(null) as A ,'B1', 'C1', to_char(null) as D
    FROM dual;
    
    SELECT * FROM t5;
    
            ID A  B  C  D
    ---------- -- -- -- --
             1 A     C
             2    B     D
             3 A1 A     D1  -------- this row is different
             4    B1 C1
    
    your result will be:
    
    A  B  C  D
    -- -- -- --
    A  B  C  D
    A1 B1 C1 D1
       B1 C1
    
    Here's my revised version:
    SELECT  MAX(A) AS A,
            MAX(B) AS B,
            MAX(C) AS C,
            MAX(D) AS D
    FROM   (SELECT row_number( ) OVER (PARTITION BY LEV ORDER BY ID) AS rn,
                    DECODE(lev,1,A) A,
                    DECODE(lev,2,B) B,
                    DECODE(lev,3,C) C,
                    DECODE(lev,4,D) D
            FROM    t5,(SELECT LEVEL lev FROM dual CONNECT BY LEVEL <=4)
            WHERE
                    CASE
                            WHEN    Lev = 1
                            THEN    A
                            WHEN    Lev = 2
                            THEN    B
                            WHEN    Lev = 3
                            THEN    C
                            WHEN    Lev = 4
                            THEN    D
                    END IS NOT NULL
            )
    GROUP BY RN;
    
    A  B  C  D
    -- -- -- --
    A  B  C  D
    A1 A  C1 D1
       B1
    

Leave a Reply

You must be logged in to post a comment.

RSS feed for comments on this question