【问题标题】:Simplify Case When If then statement简化 Case When If then 语句
【发布时间】:2019-08-02 17:32:36
【问题描述】:

我们的 MIS 提供商向我提供了以下 CASE WHEN 声明。由于我不是专家,我正在考虑简化这一点,所以我越容易阅读,我就越有机会理解和学习。

当前声明:

,CASE SopOrderItem.SoiProcessMethod:WHEN 0 
THEN IF SopOrderItem.SoiReplenishmentOrder 
THEN DO: IF SopProduct.SopPrePostPaid = 0 
THEN ASSIGN lv-ProcessMethod = "Replenishment Pay on Replenishment".
ELSE ASSIGN lv-ProcessMethod = "Replenishment Pay on Delivery".
END.
ELSE lv-processmethod = "Call Off":U.
WHEN 1 THEN lv-processmethod = "On Demand":U.
WHEN 2 THEN lv-processmethod = "Personalised":U.
END CASE

这是我能够写的,我知道我坚持的部分是WHEN SopOrderItem.SoiProcessMethod = 0。在这一点上,我不明白该声明。据我所知,当 SopOrderItem.SoiProcessMethod 为 0 时,检查 SopProduct.SopPrePostPaid 是否也为 0,如果两者都为真,则“补货时付款”,如果不是,则“补货时付款”。

有什么方法可以简化语句,让我更容易理解。

我目前有以下语句,但这导致我的查询失败并需要很长时间才能刷新:

CASE WHEN SopOrderItem.SoiProcessMethod = 1 THEN 'On Demand'
WHEN SopOrderItem.SoiProcessMethod = 2 THEN 'Personalised'
WHEN SopOrderItem.SoiProcessMethod = 0 AND SopProduct.SopPrePostPaid = 0 THEN "Replenishment Pay on Replenishment"
WHEN SopOrderItem.SoiProcessMethod = 0 AND SopProduct.SopPrePostPaid <> 0 THEN "Replenishment Pay on Delivery"
ELSE 'Call Off'
END

【问题讨论】:

    标签: sql excel openedge case-when progress-db


    【解决方案1】:

    我个人会将 CASE 和 IF 分开,而不是将它们合并。但这只会提高可读性。如果这是您依赖这些值的某种查询的一部分,我认为您需要重新考虑它,因为它不会非常有效。

    (您需要确保这段代码确实给出了相同的结果 - 如果没有数据并且没有 SopOrderItem + SopProduct 的定义,这有点困难)。

    CASE SopOrderItem.SoiProcessMethod:
        WHEN 0 THEN DO :
            IF SopOrderItem.SoiReplenishmentOrder THEN DO:
                IF SopProduct.SopPrePostPaid = 0 THEN
                    ASSIGN lv-ProcessMethod = "Replenishment Pay on Replenishment".
                ELSE 
                    ASSIGN lv-ProcessMethod = "Replenishment Pay on Delivery".
            END.
            ELSE lv-processmethod = "Call Off":U.
        END.
    
        WHEN 1 THEN lv-processmethod = "On Demand":U.
        WHEN 2 THEN lv-processmethod = "Personalised":U.
    END CASE.
    

    您也可以只设置 IF:

    IF SopOrderItem.SoiProcessMethod = 0 THEN DO :
        IF SopOrderItem.SoiReplenishmentOrder THEN DO:
            IF SopProduct.SopPrePostPaid = 0 THEN
                ASSIGN lv-ProcessMethod = "Replenishment Pay on Replenishment".
            ELSE 
                ASSIGN lv-ProcessMethod = "Replenishment Pay on Delivery".
        END.
        ELSE lv-processmethod = "Call Off":U.
    END.
    ELSE IF SopOrderItem.SoiProcessMethod = 1 THEN lv-processmethod = "On Demand":U.
    ELSE IF SopOrderItem.SoiProcessMethod = 2 THEN lv-processmethod = "Personalised":U.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多