You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将SQL中CASE语句替换为过滤逻辑?寻求技术协助

替换CASE语句为过滤逻辑的方案

先明确原代码中三个字段的核心逻辑:

  1. valor_encargos:依据div.ajuizada_em是否非空,对债务总和分别乘以0.1或0.05后格式化
  2. valor_honorarios:仅当div.ajuizada_em非空时计算0.1倍债务总和,否则返回'0'
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 23:40:35