複数のクエリ列に同じCASE WHEN条件を使用する


12

SELECT複数の列が同じCASE WHEN条件を使用して、条件が1回だけチェックされるように句を書き換える「より良い」方法はありますか?

以下の例を参照してください。

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

注意:

  • クエリによって暗示される明らかな正規化の問題を認識しています。私は問題を実証したかっただけです。

そして、これらすべての列はauthTimeauthUsercmplTime同じテーブルにいますか?
ypercubeᵀᴹ

回答:


7

Oracle(およびSQL標準)でも、CASE単一の値を返す式です。それはされていない、それはいくつかの他の言語であるようにフローの制御に使用します。したがって、複数の列または他の操作を条件付きで決定するために使用することはできません。

ビューに長いバージョンのコード(既に機能している)を配置し、正式なクエリでそれを心配しないでください。

また、より正規化された設計を検討することもできます。たとえば、キーの一部としてtypeを使用して、監査の詳細を別のテーブルに保存しませんか?これにより、特により多くの型が追加されると、コードの保守がはるかに簡単になります...


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
私はそれを投稿することを考えましたが、それは同じくらい長い時間です。良い方法はないと思います。
フィリ

それは質問+1に答えますが、他の人が示したように、あなたが始めた方が良いです。各testStatusに対応する値を連結し、それらを分割することもできますが、それはさらに悪いことです。
リーリッフェル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.