복붙노트

[SQL] SQL Server의 중첩 된 경우 문 로직을 수행하는 가장 좋은 방법은

SQL

SQL Server의 중첩 된 경우 문 로직을 수행하는 가장 좋은 방법은

나는 열 몇이 조건의 꽤 많은에 따라 계산 될 필요가 반환하여 SQL 쿼리를 쓰고 있어요.

나는 현재 중첩 된 경우 문을 사용하고 있지만이 더러워지고. 더 나은 (더 조직 및 / 또는 읽을 수있는) 방법이 있나요?

(I 2005 Microsoft SQL Server를 사용하고 있습니다)

단순화 된 예 :

SELECT
    col1,
    col2,
    col3,
    CASE
        WHEN condition 
        THEN
            CASE
                WHEN condition1 
                THEN
                    CASE 
                        WHEN condition2
                        THEN calculation1
                        ELSE calculation2
                    END
                ELSE
                    CASE 
                        WHEN condition2
                        THEN calculation3
                        ELSE calculation4
                    END
            END
        ELSE 
            CASE 
                WHEN condition1 
                THEN 
                    CASE
                        WHEN condition2 
                        THEN calculation5
                        ELSE calculation6
                    END
                ELSE
                    CASE
                        WHEN condition2 
                        THEN calculation7
                        ELSE calculation8
                    END
            END            
    END AS 'calculatedcol1',
    col4,
    col5 -- etc
FROM table

해결법

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

    1.당신은 COALESCE 트릭, 예를 들어, 어떤 종류의를 시도해 볼 수도 있습니다 :

    당신은 COALESCE 트릭, 예를 들어, 어떤 종류의를 시도해 볼 수도 있습니다 :

    SELECT COALESCE(
      CASE WHEN condition1 THEN calculation1 ELSE NULL END,
      CASE WHEN condition2 THEN calculation2 ELSE NULL END,
      etc...
    )
    
  2. ==============================

    2.하나에 모든 경우를 감싸.

    하나에 모든 경우를 감싸.

    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
    
  3. ==============================

    3.당신은 상황을 피하기 위해 여러 조건을 결합 할 수 있습니다 :

    당신은 상황을 피하기 위해 여러 조건을 결합 할 수 있습니다 :

    CASE WHEN condition1 = true AND condition2 = true THEN calculation1 
         WHEN condition1 = true AND condition2 = false 
         ELSE 'what so ever' END,
    
  4. ==============================

    4.나는 개인적으로 국한 포함 된 CASE 식을 유지, 그것은이 방법을한다. 또한 무슨 일이 일어나고 있는지 설명에 주석을 넣어 것입니다. 너무 복잡하다면, 함수로 그것을 밖으로 휴식.

    나는 개인적으로 국한 포함 된 CASE 식을 유지, 그것은이 방법을한다. 또한 무슨 일이 일어나고 있는지 설명에 주석을 넣어 것입니다. 너무 복잡하다면, 함수로 그것을 밖으로 휴식.

    SELECT
        col1,
        col2,
        col3,
        CASE WHEN condition THEN
          CASE WHEN condition1 THEN
            CASE WHEN condition2 THEN calculation1
            ELSE calculation2 END
          ELSE
            CASE WHEN condition2 THEN calculation3
            ELSE calculation4 END
          END
        ELSE CASE WHEN condition1 THEN 
          CASE WHEN condition2 THEN calculation5
          ELSE calculation6 END
        ELSE CASE WHEN condition2 THEN calculation7
             ELSE calculation8 END
        END AS 'calculatedcol1',
        col4,
        col5 -- etc
    FROM table
    
  5. ==============================

    5.여기에 중첩 된 "복잡한"case 문에 간단한 해결책이다 : --nested 케이스 복잡한 표현

    여기에 중첩 된 "복잡한"case 문에 간단한 해결책이다 : --nested 케이스 복잡한 표현

    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
    

    그냥 있는지 확인 당신은 모든 경우 문에 대한 최종 문이

  6. ==============================

    6.사용자 정의 함수는 서버 나은, 적어도 논리를 숨길 수 있습니다 - ESP. 당신은 둘 이상의 조회에서이 작업을 수행해야하는 경우

    사용자 정의 함수는 서버 나은, 적어도 논리를 숨길 수 있습니다 - ESP. 당신은 둘 이상의 조회에서이 작업을 수행해야하는 경우

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

    7.우리는 성능 오버 헤드를 줄이기 위해 함께 여러 조건을 결합 할 수 있습니다.

    우리는 성능 오버 헤드를 줄이기 위해 함께 여러 조건을 결합 할 수 있습니다.

    세 개의 변수 우리는 사건을 수행하고자하는 A B C는있다 보자. 우리는 다음과 같이이 작업을 수행 할 수 있습니다

    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,
    
  8. ==============================

    8.나는 그러나 @deejers에 의해 주어진에 답변을 추가하고 싶어,이를 통해 가서 모든 해답은 고급형 발견

    나는 그러나 @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
    

    당신은 많은 시나리오에서 많은 도움이 될 것입니다, 그 필수하지 ELSE 선택을 할 수 있습니다.

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

    9.이 예는 SQL case 문이있을 때처럼 보이게하는 방법, 그림 쇼 당신을 도울 수있는 경우와 루프의 경우 하나 이상의 내부

    이 예는 SQL case 문이있을 때처럼 보이게하는 방법, 그림 쇼 당신을 도울 수있는 경우와 루프의 경우 하나 이상의 내부

  10. from https://stackoverflow.com/questions/505747/best-way-to-do-nested-case-statement-logic-in-sql-server by cc-by-sa and MIT license