mysql - 复杂案例陈述的替代方案
问题描述
我确定我做错了,但我找不到常识替代方案是什么。
我的输入是一个复杂的长字符串字段,我需要将其分解为其他字段。
我使用的是案例陈述,但它正在膨胀成数百种变体。基本上是以下内容的重复版本,除了每个版本都长到数百行。当事情发生变化并被添加时,更新是一件痛苦的事。
SET `BrandName` =
CASE
WHEN `SaleString` like '%Posh%' THEN 'Posh Purchaser'
WHEN `SaleString` like '%DFM%' THEN 'Deep Fried Meat'
WHEN `SaleString` like '%Glam%' THEN 'Glamour Girl'
-- [WHEN search_condition THEN statement_list] ...
ELSE NULL
END
有没有办法使用包含子字符串/值对的翻译表?
就像是...
UPDATE `Sales`
SET `BrandName` = `translation`.`value`
WHERE '%substring%' = `translation`.`clue`;
编辑:
比尔的这个回答非常适合我。谢谢你们。
UPDATE Sales s
JOIN Translation t ON s.SaleString LIKE CONCAT('%', t.clue, '%')
SET s.BrandName = t.value
解决方案
最简单且维护成本或更换完整开关的成本更低。
将创建一个(临时)表,您可以在其中保留模式和替换。
如果发生变化,您可以从表中插入、更新或删除记录。
创建表并插入
CREATE TABLE update_sales (
pattern VARCHAR(255)
, replace_with VARCHAR(255)
);
INSERT INTO update_sales (pattern, replace_with) VALUES('Posh', 'Posh Purchaser');
INSERT INTO update_sales (pattern, replace_with) VALUES('DFM', 'Deep Fried Meat');
INSERT INTO update_sales (pattern, replace_with) VALUES('Glam', 'Glamour Girl');
并使用以下查询..
询问
UPDATE
Sales
INNER JOIN
update_sales
ON
Sales.SaleString LIKE CONCAT('%', update_sales.pattern , '%')
SET
Sales.SaleString = update_sales.replace_with
结果
SELECT * FROM Sales;
| SaleString |
| --------------- |
| Posh Purchaser |
| Deep Fried Meat |
| Glamour Girl |
推荐阅读
- javascript - 如何在javascript的foreach语句中初始化id?
- database - 为多个独特的应用程序设计一个通用数据库
- spyder - 在 spyder (python 3.6) 中突出显示#text (comments)
- javascript - 根据特定条件制作不同传奇副作用的正确方法是什么?
- java - 使用嵌套的 for 循环将字符串数组中的每个字符串与一个用户输入字符串进行比较
- jmeter-plugins - 为什么 HLS 采样器错误显示空白错误
- android - 不幸的是,应用程序已停止 Facebook 登录
- r - 使用 if 语句的 gsub 函数
- excel - Excel CSV 导入:QueryTable.FillAdjacentFormulas 仅适用于第二次刷新
- php - 从没有allow_url_include的远程php函数获取变量