我肯定我做错了,但我找不到另一种常识。
我的输入是一个复杂的长字符串字段,需要分解成其他字段。
我用的是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
最佳答案
您需要使用转换表的联接将每个SaleString与右侧行匹配。完成后,将BrandName设置为相应的值。
UPDATE Sales s
JOIN Translation t ON s.SaleString LIKE CONCAT('%', t.clue, '%')
SET s.BrandName = t.value
注意,如果有任何SaleString值与多个模式匹配,那么这将做一些与案例解决方案略有不同的事情。CASE解决方案将基于第一个匹配的模式设置BrandName,但是JOIN解决方案将匹配所有模式,并逐个将BrandName设置为每个模式。
示例:如果您的SaleString是“豪华Glam”,则它匹配两种模式。JOIN将处理SaleString两次,每次匹配一次首先,它将在那一行的销售中把品牌名称设置为“时髦的买家”,然后它将找到第二个匹配项,并将品牌名称改写为“魅力女孩”。
关于mysql - 复杂案件陈述的替代,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53354702/