我确定我做错了,但是我找不到常识性的选择。
我的输入是一个复杂的长字符串字段,我需要将其分解为其他字段。
我使用的是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
答案 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 |
答案 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两次,每次匹配一次。首先,它将在该销售行上将品牌名称设置为“豪华购买者”,然后将找到第二个匹配项并将品牌名称覆盖为“魅力女孩”。