能否将SQL中CASE语句替换为过滤逻辑?寻求技术协助
替换CASE语句为过滤逻辑的方案
先明确原代码中三个字段的核心逻辑:
valor_encargos:依据div.ajuizada_em是否非空,对债务总和分别乘以0.1或0.05后格式化valor_honorarios:仅当div.ajuizada_em非空时计算0.1倍债务总和,否则返回'0'notificada:判断nnt.divida_id是否为空,返回布尔值
方案1:用条件聚合简化写法(保留单查询)
把分支逻辑嵌入聚合函数内部,替代外层CASE,写法更简洁:
REPLACE(ROUND(SUM((deb.valor_principal + deb.valor_multa + deb.valor_juros_atualizado) * CASE WHEN div.ajuizada_em IS NOT NULL THEN 0.1 ELSE 0.05 END), 2)::text, '.', ',') AS valor_encargos, REPLACE(ROUND(SUM((deb.valor_principal + deb.valor_multa + deb.valor_juros_atualizado) * CASE WHEN div.ajuizada_em IS NOT NULL THEN 0.1 ELSE 0 END), 2)::text, '.', ',') AS valor_honorarios, (nnt.divida_id IS NULL) AS notificada
注:notificada字段可直接简化为nnt.divida_id IS NULL,该表达式本身就返回布尔值,无需CASE包裹。
方案2:用WHERE过滤拆分查询(彻底移除SELECT中的CASE)
如果你的“过滤逻辑”指用WHERE子句拆分场景,可分成两个独立查询分别计算:
场景1:div.ajuizada_em IS NOT NULL
SELECT REPLACE(ROUND(SUM((deb.valor_principal + deb.valor_multa + deb.valor_juros_atualizado) * 0.1), 2)::text, '.', ',') AS valor_encargos, REPLACE(ROUND(SUM((deb.valor_principal + deb.valor_multa + deb.valor_juros_atualizado) * 0.1), 2)::text, '.', ',') AS valor_honorarios, (nnt.divida_id IS NULL) AS notificada FROM your_table WHERE div.ajuizada_em IS NOT NULL -- 补充你的GROUP BY、JOIN等子句
场景2:div.ajuizada_em IS NULL
SELECT REPLACE(ROUND(SUM((deb.valor_principal + deb.valor_multa + deb.valor_juros_atualizado) * 0.05), 2)::text, '.', ',') AS valor_encargos, '0' AS valor_honorarios, (nnt.divida_id IS NULL) AS notificada FROM your_table WHERE div.ajuizada_em IS NULL -- 补充你的GROUP BY、JOIN等子句
方案3:用CTE预计算基础值(减少重复计算)
先用CTE预计算债务总和,再用简单逻辑生成目标字段,可读性更强:
WITH base_debts AS ( SELECT div.ajuizada_em, nnt.divida_id, SUM(deb.valor_principal + deb.valor_multa + deb.valor_juros_atualizado) AS total_debt FROM your_table -- 补充你的JOIN、WHERE、GROUP BY等子句 ) SELECT REPLACE(ROUND(total_debt * CASE WHEN ajuizada_em IS NOT NULL THEN 0.1 ELSE 0.05 END, 2)::text, '.', ',') AS valor_encargos, REPLACE(ROUND(total_debt * CASE WHEN ajuizada_em IS NOT NULL THEN 0.1 ELSE 0 END, 2)::text, '.', ',') AS valor_honorarios, (divida_id IS NULL) AS notificada FROM base_debts
内容的提问来源于stack exchange,提问作者Emanuel Nascimento
相关产品推荐
相关产品推荐

