sql - 将 CASE 重写为 COALESCE
问题描述
我的查询中有部分代码有 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
这是部分,我重写了一些 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 重写行,或者它有一些更好的变体,如何重写它?
解决方案
问题似乎是您正在努力为涉及的案例重新编写逻辑AND
CASE WHEN u.ClientCharges IS NOT NULL AND u.ClientCharges > 0 THEN 1 ELSE 0 END AS OrgCounter
对于读者来说是否更清楚尚有争议,但您要求遵循以下逻辑:
CASE WHEN coalesce(u.ClientCharges,0) > 0 THEN 1 ELSE 0 END AS OrgCounter
这在 中的子句AND
使用相同字段时有效,但对于要检查多个不同字段的子句,您需要保持原样。
在这段代码中对数据进行了大量解释——实际上业务逻辑被嵌入到 SQL 中——您可能希望重新考虑这一点。
推荐阅读
- json - API重力形式,JSON大小问题
- julia - How to iterate over whole array when I need i, j, k?
- git - Git apply some changes from master/branch from master to old release
- java - Using stream API estimate difference between object properties
- chart.js - How i can localize days and month name in ChartJS 3.x?
- python - 创建类的新实例会获取旧的默认属性
- mongodb - MongoDB 复制初始同步在同一点失败
- c# - .net 5 从服务中的 JWT 获取用户声明
- git - 我们可以使用我们现有的仓库在 AWS BeanStalk 中使用 git clone/git pull 吗?“Laravel 网络应用程序”
- bash - 将 kubectl 命令输出保存在 Bashscript 的变量中