SQL Server에서 중첩된 대소문자 논리를 수행하는 가장 좋은 방법

꽤 많은 조건에 따라 반환되는 열 중 몇 개를 계산해야 하는 SQL 쿼리를 작성하고 있습니다.

현재 중첩된 케이스 문을 사용하고 있지만 점점 지저분해지고 있습니다. 더 나은(더 체계적이고 가독성이 높은) 방법이 있나요?

(Microsoft SQL Server, 2005 사용 중)


단순화된 예제입니다:

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
질문에 대한 의견 (3)
해결책

예를 들어 COALESCE 트릭을 사용해 볼 수 있습니다:

SELECT COALESCE(
  CASE WHEN condition1 THEN calculation1 ELSE NULL END,
  CASE WHEN condition2 THEN calculation2 ELSE NULL END,
  등...
)
해설 (5)

랩 모든 경우에도 하나의.

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)

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

CASE WHEN condition1 = true AND condition2 = true THEN calculation1 
     WHEN condition1 = true AND condition2 = false 
     ELSE 'what so ever' END,
해설 (0)

저는 개인적으로 이런 식으로 임베드된 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
해설 (0)

39 의 간단한 해결책은 here& 네스트된 &quot Complex"; 케이스 스테망:

  • 네스트된 경우 복잡한 표현식에서는
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

그냥 모든 사건에 대한 최종 기술서임을 기술서임을 있어야 합니다

해설 (1)

사용자 정의 함수가 적어도 로직을 숨기는 데 더 효과적일 수 있습니다. 특히 둘 이상의 쿼리에서 이 작업을 수행해야 하는 경우 더욱 그렇습니다.

해설 (0)

성능 오버헤드를 줄일 수 있는 조건을 함께 다수의 수 있습니다.

이제 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,
해설 (0)

그러나 이 모든 답을 찾을 수 있고, 내가 겪은 이야기를 하는 슈퍼 준활성 추가합니까 오토메이티드 @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

다른 만들 수 있다는 것은 아주 도움됐네 선택적입니다 옵션임 등 대부분의 시나리오에서와.

해설 (0)

이 예에서는 이 그림은 SQL 경우 어떻게 도움이 기술서임을 보일 경우 및 하나 이상의 경우 경우 내부 루프

! [입력하십시오. 이미지 여기에 설명을] [1]

해설 (0)