여러 쿼리 열에 동일한 CASE WHEN 조건 사용


12

조건이 한 번만 검사되도록 SELECT여러 열이 동일한 CASE WHEN조건을 사용 하는 절 을 다시 작성하는 "더 나은"방법이 있습니까?

아래 예를 참조하십시오.

SELECT
    CASE testStatus 
        WHEN 'A' THEN 'Authorized'
        WHEN 'C' THEN 'Completed'
        WHEN 'P' THEN 'In Progress'
        WHEN 'X' THEN 'Cancelled'
    END AS Status,

    CASE testStatus 
        WHEN 'A' THEN authTime
        WHEN 'C' THEN cmplTime
        WHEN 'P' THEN strtTime
        WHEN 'X' THEN cancTime
    END AS lastEventTime,

    CASE testStatus 
        WHEN 'A' THEN authBy
        WHEN 'C' THEN cmplBy
        WHEN 'P' THEN strtBy
        WHEN 'X' THEN cancBy
    END AS lastEventUser
FROM test

비 SQL 의사 코드에서 코드는 다음과 같습니다.

CASE testStatus
    WHEN 'A'
        StatusCol        = 'Authorized'
        lastEventTimeCol = authTime 
        lastEventUserCol = authUser
    WHEN 'C'
        StatusCol        = 'Completed'
        lastEventTimeCol = cmplTime
        lastEventUserCol = cmplUser
    ...
END

노트 :

  • 쿼리가 암시하는 명백한 정규화 문제를 알고 있습니다. 나는 단지 문제를 보여주고 싶었다.

그리고이 모든 열은 authTime, authUser, cmplTime같은 테이블에?
ypercubeᵀᴹ

답변:


7

Oracle (및 실제로 SQL 표준)에서도 CASE단일 값을 반환하는 표현식입니다. 그것은됩니다 되지 는 다른 언어처럼 흐름의 제어에 사용. 따라서 여러 열 또는 다른 작업 중에서 조건부로 결정하는 데 사용할 수 없습니다.

더 긴 버전의 코드 (이미 작동하는 코드)를 뷰에 넣고 공식 쿼리에서 걱정하지 않아도됩니다.

보다 표준화 된 디자인을 고려할 수도 있습니다. 예를 들어 감사 세부 정보를 키의 일부로 유형과 함께 별도의 테이블에 저장하지 않는 이유는 무엇입니까? 이렇게하면 특히 더 많은 유형이 추가 될 때 코드를 유지 관리하기가 훨씬 쉽습니다.


Even in Oracle...하지만 Postgres에서는 복합 유형을 확장하여 가능합니다.
Eugen Konkov

7

이 모든 열이 같은 테이블에있는 경우 다음과 같이 사용할 수 있습니다.

    SELECT  
        'Authorized' AS StatusCol,
        authTime     AS lastEventTimeCol, 
        authUser     AS lastEventUserCol 
    FROM test
    WHERE testStatus = 'A'

  UNION ALL

    SELECT  
        'Completed', 
        cmplTime,
        cmplUser    
    FROM test
    WHERE testStatus = 'C'

  UNION ALL

    SELECT  
        'In Progress', 
        strtTime,
        strtUser    
    FROM test
    WHERE testStatus = 'P'

  UNION ALL

    SELECT  
        'Cancelled', 
        cancTime,
        cancUser    
    FROM test
    WHERE testStatus = 'X' ;

2
나는 그것을 게시하는 것을 숙고했지만 오래 걸렸다. 나는 그것을하는 좋은 방법이 있다고 생각하지 않습니다.
Philᵀᴹ

질문 +1에 대답하지만 다른 사람들이 지적했듯이 시작한 것이 좋습니다. 또한 각 testStatus에 해당하는 값을 연결 한 다음 분리 할 수 ​​있지만 훨씬 더 나쁩니다.
레이 리펠
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.