将CASE重写为COALESCE

时间:2018-10-22 08:03:25

标签: sql amazon-redshift

我的查询中包含CASE的一部分代码,我想将其重写为COALESCE

这是代码的原始部分

CASE WHEN u.ClientCharges IS NULL THEN 0 ELSE u.ClientCharges END -
                            CASE WHEN LAGClientCharges IS NULL THEN 0
                            ELSE LAGClientCharges
                            END AS my_Delta,

    CASE WHEN (CASE WHEN u.ClientCharges IS NULL THEN 0 ELSE u.ClientCharges END - CASE WHEN LAGClientCharges IS NULL THEN 0
                            ELSE LAGClientCharges END) > 0 THEN 'Gain'
         WHEN CASE WHEN u.ClientCharges IS NULL THEN 0 ELSE u.ClientCharges END - CASE WHEN LAGClientCharges IS NULL THEN 0
                            ELSE LAGClientCharges END < 0 THEN 'Loss'
                            ELSE NULL END AS GainsLosses,
    CASE WHEN u.ClientCharges >=0 AND LAGClientCharges IS NULL AND t.MonthBilled <> '2015-01-01' THEN 'New' ELSE 'Existing' END AS ClientType,

    CASE WHEN u.ClientCharges IS NULL THEN 'InActive' ELSE 'Active' END AS ActiveStatus,

    CASE WHEN LAGClientCharges IS NOT NULL AND t.MonthBilled <> '2015-01-01' THEN 1 ELSE NULL END AS ActiveLastMonth,

    CASE WHEN u.ClientCharges IS NULL AND (LAGClientCharges <> 0 AND LAGClientCharges IS NOT NULL) AND t.MonthBilled <> '1/1/2015' THEN 1 ELSE NULL END AS OneMonthChurn,

    u2.FeatureKeyCount,

    CASE WHEN u.ClientCharges IS NOT NULL AND u.ClientCharges > 0 THEN 1 ELSE 0 END AS OrgCounter

这是part,我在其中重写了一些CASE语句

    COALESCE(u.ClientCharges, 0) - COALESCE(LAGClientCharges, 0) AS my_Delta,

    CASE WHEN (COALESCE(u.ClientCharges , 0) - COALESCE(LAGClientCharges , 0)) > 0 THEN 'Gain'
         WHEN COALESCE (u.ClientCharges , 0) - COALESCE(LAGClientCharges , 0) < 0 THEN 'Loss'
                            ELSE NULL END AS GainsLosses,
    CASE WHEN u.ClientCharges >=0 AND LAGClientCharges IS NULL AND t.MonthBilled <> '2015-01-01' THEN 'New' ELSE 'Existing' END AS ClientType,

   COALESCE (u.ClientCharges, 'InActive') AS ActiveStatus,

    CASE WHEN LAGClientCharges IS NOT NULL AND t.MonthBilled <> '2015-01-01' THEN 1 ELSE NULL END AS ActiveLastMonth,

    CASE WHEN u.ClientCharges IS NULL AND (LAGClientCharges <> 0 AND LAGClientCharges IS NOT NULL) AND t.MonthBilled <> '2015-01-01' THEN 1 ELSE NULL END AS OneMonthChurn,

    u2.FeatureKeyCount,

    CASE WHEN u.ClientCharges IS NOT NULL AND u.ClientCharges > 0 THEN 1 ELSE 0 END AS OrgCounter

但是我如何用AND重写行,或者它具有更好的变体,如何重写呢?

1 个答案:

答案 0 :(得分:2)

问题似乎是您正在努力重新编写涉及AND

的案件的逻辑
CASE WHEN u.ClientCharges IS NOT NULL AND u.ClientCharges > 0 THEN 1 ELSE 0 END AS OrgCounter

对于读者来说是否更清晰尚有待商but,但您正在沿以下方向寻求逻辑:

CASE WHEN coalesce(u.ClientCharges,0) > 0 THEN 1 ELSE 0 END AS OrgCounter

AND中的子句使用相同的字段时,此方法有效,但是对于要检查多个不同字段的子句,则需要保留它们不变。

这段代码中正在进行大量的数据解释-实际上,业务逻辑已嵌入到SQL中-您可能希望重新考虑。