Note: Forums will be making significant UX changes to address key usability improvements surrounding search, discoverability and navigation. To learn more about these changes please visit the announcement which can be found HERE.
SELECT CASE is returning NULL rows - How to remove them

Answered SELECT CASE is returning NULL rows - How to remove them

  • Tuesday, February 12, 2013 10:32 AM
     
     

    Hi

    I have a query which returns a row of NULL values wich I suspect is coming from the select case. How would I correct this without rewriting the whole sql query. This is for a matrix which put the 'section' into a condition performance according to some calculations. I have only included the select case part for easy readability.

    SELECT

    CASE WHEN ((B.PERFORMANCE_RATING >= 1 AND B.PERFORMANCE_RATING <= 49) AND(B.CONDITION_RATING >= 1 AND B.CONDITION_RATING <= 49)) THEN B.SECTION ELSE NULL END  AS P_POOR_C_POOR,


    CASE WHEN ((B.PERFORMANCE_RATING >= 50 AND B.PERFORMANCE_RATING <= 79) AND(B.CONDITION_RATING >= 1 AND B.CONDITION_RATING <= 49)) THEN B.SECTION ELSE NULL END  AS P_MODERATE_C_POOR,


    CASE WHEN ((B.PERFORMANCE_RATING >= 80 AND B.PERFORMANCE_RATING <= 100) AND(B.CONDITION_RATING >= 1 AND B.CONDITION_RATING <= 49)) THEN B.SECTION ELSE NULL END  AS P_GOOD_C_POOR,


    CASE WHEN ((B.PERFORMANCE_RATING >= 1 AND B.PERFORMANCE_RATING <= 49) AND(B.CONDITION_RATING >= 50 AND B.CONDITION_RATING <= 79)) THEN B.SECTION ELSE NULL END  AS P_POOR_C_MODERATE,


    CASE WHEN ((B.PERFORMANCE_RATING >= 50 AND B.PERFORMANCE_RATING <= 79) AND(B.CONDITION_RATING >= 50 AND B.CONDITION_RATING <= 79)) THEN B.SECTION ELSE NULL END  AS P_MODERATE_C_MODERATE,


    CASE WHEN ((B.PERFORMANCE_RATING >= 80 AND B.PERFORMANCE_RATING <= 100) AND(B.CONDITION_RATING >= 50 AND B.CONDITION_RATING <= 79)) THEN B.SECTION ELSE NULL END  AS P_GOOD_C_MODERATE,


    CASE WHEN ((B.PERFORMANCE_RATING >= 1 AND B.PERFORMANCE_RATING <= 49) AND(B.CONDITION_RATING >= 80 AND B.CONDITION_RATING <= 100)) THEN B.SECTION ELSE NULL END  AS P_POOR_C_GOOD,


    CASE WHEN ((B.PERFORMANCE_RATING >= 50 AND B.PERFORMANCE_RATING <= 79) AND(B.CONDITION_RATING >= 80 AND B.CONDITION_RATING <= 100)) THEN B.SECTION ELSE NULL END  AS P_MODERATE_C_GOOD,


    CASE WHEN ((B.PERFORMANCE_RATING >= 80 AND B.PERFORMANCE_RATING <= 100) AND(B.CONDITION_RATING >= 80 AND B.CONDITION_RATING <= 100)) THEN B.SECTION ELSE NULL END  AS P_GOOD_C_GOOD


    FROM

    (

    ROW1:   NULL  NULL NULL NULL NULL NULL NULL NULL NULL
    ROW2:   NULL NULL NULL NULL NULL Siyaya NULL NULL NULL

    How would I exclude null row?

All Replies

  • Tuesday, February 12, 2013 12:18 PM
    Moderator
     
     Answered Has Code

    How would I exclude null row?

    One method is to wrap the query in a CTE and then use COALESCE to identify rows with all NULL values:

    WITH PerformanceRatings AS (
    SELECT 
    	CASE WHEN ((B.PERFORMANCE_RATING >= 1 AND B.PERFORMANCE_RATING <= 49) AND(B.CONDITION_RATING >= 1 AND B.CONDITION_RATING <= 49)) THEN B.SECTION ELSE NULL END  AS P_POOR_C_POOR,
    	CASE WHEN ((B.PERFORMANCE_RATING >= 50 AND B.PERFORMANCE_RATING <= 79) AND(B.CONDITION_RATING >= 1 AND B.CONDITION_RATING <= 49)) THEN B.SECTION ELSE NULL END  AS P_MODERATE_C_POOR,
    	CASE WHEN ((B.PERFORMANCE_RATING >= 80 AND B.PERFORMANCE_RATING <= 100) AND(B.CONDITION_RATING >= 1 AND B.CONDITION_RATING <= 49)) THEN B.SECTION ELSE NULL END  AS P_GOOD_C_POOR,
    	CASE WHEN ((B.PERFORMANCE_RATING >= 1 AND B.PERFORMANCE_RATING <= 49) AND(B.CONDITION_RATING >= 50 AND B.CONDITION_RATING <= 79)) THEN B.SECTION ELSE NULL END  AS P_POOR_C_MODERATE,
    	CASE WHEN ((B.PERFORMANCE_RATING >= 50 AND B.PERFORMANCE_RATING <= 79) AND(B.CONDITION_RATING >= 50 AND B.CONDITION_RATING <= 79)) THEN B.SECTION ELSE NULL END  AS P_MODERATE_C_MODERATE,
    	CASE WHEN ((B.PERFORMANCE_RATING >= 80 AND B.PERFORMANCE_RATING <= 100) AND(B.CONDITION_RATING >= 50 AND B.CONDITION_RATING <= 79)) THEN B.SECTION ELSE NULL END  AS P_GOOD_C_MODERATE,
    	CASE WHEN ((B.PERFORMANCE_RATING >= 1 AND B.PERFORMANCE_RATING <= 49) AND(B.CONDITION_RATING >= 80 AND B.CONDITION_RATING <= 100)) THEN B.SECTION ELSE NULL END  AS P_POOR_C_GOOD,
    	CASE WHEN ((B.PERFORMANCE_RATING >= 50 AND B.PERFORMANCE_RATING <= 79) AND(B.CONDITION_RATING >= 80 AND B.CONDITION_RATING <= 100)) THEN B.SECTION ELSE NULL END  AS P_MODERATE_C_GOOD,
    	CASE WHEN ((B.PERFORMANCE_RATING >= 80 AND B.PERFORMANCE_RATING <= 100) AND(B.CONDITION_RATING >= 80 AND B.CONDITION_RATING <= 100)) THEN B.SECTION ELSE NULL END  AS P_GOOD_C_GOOD
    FROM ...
    )
    SELECT 
    	P_POOR_C_POOR,
    	P_MODERATE_C_POOR,
    	P_GOOD_C_POOR,
    	P_POOR_C_MODERATE,
    	P_MODERATE_C_MODERATE,
    	P_GOOD_C_MODERATE,
    	P_POOR_C_GOOD,
    	P_MODERATE_C_GOOD,
    	P_GOOD_C_GOOD
    FROM PerformanceRatings
    WHERE
    	COALESCE(
    		P_POOR_C_POOR,
    		P_MODERATE_C_POOR,
    		P_GOOD_C_POOR,
    		P_POOR_C_MODERATE,
    		P_MODERATE_C_MODERATE,
    		P_GOOD_C_MODERATE,
    		P_POOR_C_GOOD,
    		P_MODERATE_C_GOOD,
    		P_GOOD_C_GOOD
    	) IS NOT NULL;


    Dan Guzman, SQL Server MVP, http://www.dbdelta.com

    • Marked As Answer by CarlLabuschagne Thursday, February 14, 2013 7:10 AM
    •