如何在MySQL UPDATE语句中让计算结果小于0的RECEITA_ADM_YMF字段置0
解决MySQL UPDATE中设置字段值不小于0的问题
问题描述
我正在使用的SQL代码如下:
UPDATE `tab_base_asset` INNER JOIN `vw_calcula_taxa_adm_ymf_acumulada_3` ON `tab_base_asset`.`codigo_fundo` = `vw_calcula_taxa_adm_ymf_acumulada_3`.`codigo_fundo` SET `tab_base_asset`.`RECEITA_ADM_YMF` = (`tab_base_asset`.`saldo_bruto_cdc`/`vw_calcula_taxa_adm_ymf_acumulada_3`.`saldo_bruto_cdc`) * `vw_calcula_taxa_adm_ymf_acumulada_3`.`receita_YMF_ACUM`, `tab_base_asset`.`RECEITA_REBATE` = (`tab_base_asset`.`saldo_bruto_cdc`/`vw_calcula_taxa_adm_ymf_acumulada_3`.`saldo_bruto_cdc`) * `vw_calcula_taxa_adm_ymf_acumulada_3`.`Rebate_acumulado` WHERE `tab_base_asset`.`data` = (SELECT `tab_aux_datas_base_unica`.`data_final` FROM `tab_aux_datas_base_unica`);
需要实现:当RECEITA_ADM_YMF的计算结果小于0时,将该列的值设为0。尝试过IF和CASE语句,但要么报语法错误,要么不确定放置位置。
解决方案
直接在SET子句的赋值部分,用IF()函数或CASE语句包裹计算表达式即可实现条件判断。
方法1:使用IF()函数
UPDATE `tab_base_asset` INNER JOIN `vw_calcula_taxa_adm_ymf_acumulada_3` ON `tab_base_asset`.`codigo_fundo` = `vw_calcula_taxa_adm_ymf_acumulada_3`.`codigo_fundo` SET `tab_base_asset`.`RECEITA_ADM_YMF` = IF( -- 判断计算结果是否小于0 (`tab_base_asset`.`saldo_bruto_cdc`/`vw_calcula_taxa_adm_ymf_acumulada_3`.`saldo_bruto_cdc`) * `vw_calcula_taxa_adm_ymf_acumulada_3`.`receita_YMF_ACUM` < 0, 0, -- 满足条件时设为0 -- 不满足时用原计算值 (`tab_base_asset`.`saldo_bruto_cdc`/`vw_calcula_taxa_adm_ymf_acumulada_3`.`saldo_bruto_cdc`) * `vw_calcula_taxa_adm_ymf_acumulada_3`.`receita_YMF_ACUM` ), `tab_base_asset`.`RECEITA_REBATE` = (`tab_base_asset`.`saldo_bruto_cdc`/`vw_calcula_taxa_adm_ymf_acumulada_3`.`saldo_bruto_cdc`) * `vw_calcula_taxa_adm_ymf_acumulada_3`.`Rebate_acumulado` WHERE `tab_base_asset`.`data` = (SELECT `tab_aux_datas_base_unica`.`data_final` FROM `tab_aux_datas_base_unica`);
方法2:使用CASE语句
UPDATE `tab_base_asset` INNER JOIN `vw_calcula_taxa_adm_ymf_acumulada_3` ON `tab_base_asset`.`codigo_fundo` = `vw_calcula_taxa_adm_ymf_acumulada_3`.`codigo_fundo` SET `tab_base_asset`.`RECEITA_ADM_YMF` = CASE WHEN (`tab_base_asset`.`saldo_bruto_cdc`/`vw_calcula_taxa_adm_ymf_acumulada_3`.`saldo_bruto_cdc`) * `vw_calcula_taxa_adm_ymf_acumulada_3`.`receita_YMF_ACUM` < 0 THEN 0 ELSE (`tab_base_asset`.`saldo_bruto_cdc`/`vw_calcula_taxa_adm_ymf_acumulada_3`.`saldo_bruto_cdc`) * `vw_calcula_taxa_adm_ymf_acumulada_3`.`receita_YMF_ACUM` END, `tab_base_asset`.`RECEITA_REBATE` = (`tab_base_asset`.`saldo_bruto_cdc`/`vw_calcula_taxa_adm_ymf_acumulada_3`.`saldo_bruto_cdc`) * `vw_calcula_taxa_adm_ymf_acumulada_3`.`Rebate_acumulado` WHERE `tab_base_asset`.`data` = (SELECT `tab_aux_datas_base_unica`.`data_final` FROM `tab_aux_datas_base_unica`);
说明
- 两种写法都兼容MySQL Workbench 5.2版本,不会出现语法错误。
- 若不想重复编写计算表达式,可先通过子查询算出该值再进行判断,但上述写法更直接简洁。
内容的提问来源于stack exchange,提问作者Marcos Antonio de Jesus
相关产品推荐
相关产品推荐

