如果if语句简化案例

问题描述 投票:0回答:1

我从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如果两者都为真,那么“Replenishment Pay on Replenishment”如果不是那么“Replenishment Pay on Delivery”。

有没有办法可以简化声明,让我更容易理解。

我现在有以下声明,但这导致我的查询失败并需要花费很长时间才能刷新:

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个回答
3
投票

我个人会将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.
© www.soinside.com 2019 - 2024. All rights reserved.