首页 > 解决方案 > 复杂案例陈述的替代方案

问题描述

我确定我做错了,但我找不到常识替代方案是什么。

我的输入是一个复杂的长字符串字段,我需要将其分解为其他字段。

我使用的是案例陈述,但它正在膨胀成数百种变体。基本上是以下内容的重复版本,除了每个版本都长到数百行。当事情发生变化并被添加时,更新是一件痛苦的事。

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

标签: mysql

解决方案


最简单且维护成本或更换完整开关的成本更低。
将创建一个(临时)表,您可以在其中保留模式和替换。
如果发生变化,您可以从表中插入、更新或删除记录。

创建表并插入

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    |

演示


推荐阅读