首页 > 解决方案 > 当每个字段仅存在某些案例时,多个字段的案例语句

问题描述

我们有一个库存功能,我们可以在其中生成账单。有一个 Edit Bill API 调用。我们已将其实现为 PATCH 调用。

一个 id = 1 的账单有 2 个 LineItems :

|  Stock Id |   Qty        |  Rate       |
|    10     |      2       |    10       |
|    11     |      3       |    20       |

现在让我们说我想改变quantity for stock Id : 10 to 5并且我想改变rate for stock Id : 11 to 40

我们将其表示为 PATCH Call :

bill : {
    id : 1

    lineItems : [
    {
        stockId : 10,
        qty : 5,
     },

     {
        stockId : 11,
        rate : 40   
     }
    ]
    }

在后端,我们运行以下查询:

    UPDATE `billlineitem` 
SET    `rate` = ( CASE 
                    WHEN stockid = 11 THEN '40' 
                    ELSE rate 
                  END ), 
       `qty` = ( CASE 
                   WHEN stockid = 10 THEN 5 
                   ELSE qty 
                 END ), 
       `updated_billitemquantity_at` = '2019-09-06 05:16:06.219' 
WHERE  `bill_id` = '1' 
       AND `stockid` IN ( 10, 11 ) 

可以吗,在上述情况下,当属性没有更改时,else 子句将从数据库中获取该属性的值。上述更新语句在事务中运行。

这是一个正确的方法吗?这是否会对每个股票 ID 的每个属性进行更新。有更好的方法吗?

我们正在使用 MySQL 数据库。

标签: mysqlcase

解决方案


您编写的内容应该可以工作,但是如果您必须为许多不同的股票 ID 更新不同的列,它将变得非常复杂。对每个 ID 进行单独的查询可能会更简单,性能也可能更好。

BEGIN TRANSACTION;
UPDATE billlineitem 
    SET rate = '40', `updated_billitemquantity_at` = '2019-09-06 05:16:06.219' 
    WHERE stockid = 10;
UPDATE billlineitem 
    SET qty = 5, `updated_billitemquantity_at` = '2019-09-06 05:16:06.219'
    WHERE stockid = 11;
COMMIT;

推荐阅读