Best way to do nested case statement logic in SQL Server

前端 未结 9 1356
误落风尘
误落风尘 2020-11-29 15:23

I\'m writing an SQL Query, where a few of the columns returned need to be calculated depending on quite a lot of conditions.

I\'m currently using nested case stateme

相关标签:
9条回答
  • 2020-11-29 15:44

    I went through this and found all the answers super cool, however wants to add to answer given by @deejers

        SELECT
        col1,
        col2,
        col3,
        CASE
            WHEN condition1 THEN calculation1 
            WHEN condition2 THEN calculation2
            WHEN condition3 THEN calculation3
            WHEN condition4 THEN calculation4
            WHEN condition5 THEN calculation5         
        END AS 'calculatedcol1',
        col4,
        col5 -- etc
    FROM table
    

    you can make ELSE optional as its not mandatory, it is very helpful in many scenarios.

    0 讨论(0)
  • 2020-11-29 15:48

    Wrap all those cases into one.


    SELECT
        col1,
        col2,
        col3,
        CASE
            WHEN condition1 THEN calculation1 
            WHEN condition2 THEN calculation2
            WHEN condition3 THEN calculation3
            WHEN condition4 THEN calculation4
            WHEN condition5 THEN calculation5
            ELSE NULL         
        END AS 'calculatedcol1',
        col4,
        col5 -- etc
    FROM table
    
    0 讨论(0)
  • 2020-11-29 15:48

    You can combine multiple conditions to avoid the situation:

    CASE WHEN condition1 = true AND condition2 = true THEN calculation1 
         WHEN condition1 = true AND condition2 = false 
         ELSE 'what so ever' END,
    
    0 讨论(0)
  • 2020-11-29 15:48

    We can combine multiple conditions together to reduce the performance overhead.

    Let there are three variables a b c on which we want to perform cases. We can do this as below:

    CASE WHEN a = 1 AND b = 1 AND c = 1 THEN '1'
         WHEN a = 0 AND b = 0 AND c = 1 THEN '0'
    ELSE '0' END,
    
    0 讨论(0)
  • 2020-11-29 15:57

    You could try some sort of COALESCE trick, eg:

    SELECT COALESCE(
      CASE WHEN condition1 THEN calculation1 ELSE NULL END,
      CASE WHEN condition2 THEN calculation2 ELSE NULL END,
      etc...
    )
    
    0 讨论(0)
  • 2020-11-29 15:58

    Here's a simple solution to the nested "Complex" case statment: --Nested Case Complex Expression

    select  datediff(dd,Invdate,'2009/01/31')+1 as DaysOld, 
        case when datediff(dd,Invdate,'2009/01/31')+1 >150 then 6 else
            case when datediff(dd,Invdate,'2009/01/31')+1 >120 then 5 else 
                case when datediff(dd,Invdate,'2009/01/31')+1 >90 then 4 else 
                    case when datediff(dd,Invdate,'2009/01/31')+1 >60 then 3 else 
                        case when datediff(dd,Invdate,'2009/01/31')+1 >30 then 2 else 
                            case when datediff(dd,Invdate,'2009/01/31')+1 >30 then 1 end 
                        end
                    end
                end
            end
        end as Bucket
    from rm20090131atb
    

    Just make sure you have an end statement for every case statement

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