复杂案件陈述的替代

时间:2018-11-17 19:21:38

标签: mysql

我确定我做错了,但是我找不到常识性的选择。

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

我使用的是case语句,但是它迅速膨胀成数百种变体。下面的内容基本上是重复的版本,但每个版本的长度都已增加到数百行。当事物发生变化并被添加时,进行更新是很痛苦的。

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

2 个答案:

答案 0 :(得分:1)

最简单,花费更少的维护或更换完整的开关。
将创建一个(临时)表,在其中保留模式并进行替换。
如果有什么变化,您可以只插入,更新或删除表中的记录。

创建表并插入

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    |

demo

答案 1 :(得分:0)

您需要使用连接到转换表,以将每个SaleString匹配到右行。完成后,将BrandName设置为相应的值。

UPDATE Sales s
JOIN Translation t ON s.SaleString LIKE CONCAT('%', t.clue, '%')
SET s.BrandName = t.value

请注意,如果有匹配多个模式的任何SaleString值,这将与CASE解决方案有所不同。您的CASE解决方案将根据第一个匹配的模式设置BrandName,但是JOIN解决方案将与所有 all 模式匹配,并将BrandName分别设置为每个模式。

示例:如果您的SaleString是“ Posh Glam”,则它匹配两种模式。 JOIN将处理SaleString两次,每次匹配一次。首先,它将在该销售行上将品牌名称设置为“豪华购买者”,然后将找到第二个匹配项并将品牌名称覆盖为“魅力女孩”。