mysql - 当每个字段仅存在某些案例时,多个字段的案例语句
问题描述
我们有一个库存功能,我们可以在其中生成账单。有一个 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 数据库。
解决方案
您编写的内容应该可以工作,但是如果您必须为许多不同的股票 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;
推荐阅读
- vba - 使用子文件夹名称自动分类电子邮件
- google-sheets-api - 使用 gspread 对谷歌电子表格的读取请求出现错误 500
- rust - 是 Vec 中的数据吗
总是密密麻麻? - javascript - 尝试替换构造函数变量时出错
- java - 从kafka主题读取时如何验证无效的分区名称
- php - Twig - 带有 3 个操作数的“for”语法,这是什么意思
- android - 有什么方法可以检测 Android TV Leanback 中键盘的可见性
- ios - WKWebView canGoForward 总是返回 false swift 5
- php - WooCommerce 仅显示可变产品的价格?
- javascript - 通过 javascript 进行表单验证