如何在SQL中实现产品名称匹配关键词更新品牌字段的操作?
问题背景
现有两张数据表
表1(示例表名:product_info)
| product_name | brands | Supplier |
|---|---|---|
| xyz | Adidas | |
| abc | Nike |
表2(示例表名:brand_mapping)
| brands | keys | Suppliers |
|---|---|---|
| X | x, y,z | Puma,Adidas |
| A | a | New Balance |
需求
检查表1的product_name是否包含表2的keys字段中的任意子关键词,若匹配成功,则将表2对应的brands值赋值给表1的brands字段。
现有Python实现代码
for index, key in enumerate(keys): for sub_index, sub_key in enumerate(key): for i, name in enumerate(product_name): if sub_key in name: Table1["brands"][i] = Table1["brands"][index]
问题解答
该逻辑能否用SQL实现?
可以,SQL完全支持这种字符串匹配+字段赋值的逻辑,核心是通过字符串匹配函数关联两张表,再用更新语句完成赋值操作。是否可以将上述Python脚本转换为SQL语句?
可以,但需要先处理表2中keys字段的逗号分隔值,将其拆分为单独的子关键词行,再进行匹配更新。以下是主流SQL方言的实现示例:
MySQL 实现
先拆分表2的keys字段为独立行:
-- 创建临时存储拆分后关键词的表 CREATE TEMPORARY TABLE split_keys AS SELECT b.brands, TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(b.keys, ',', n.n), ',', -1)) AS sub_key FROM brand_mapping b CROSS JOIN (SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3) n WHERE n.n <= LENGTH(b.keys) - LENGTH(REPLACE(b.keys, ',', '')) + 1;
再更新表1的brands字段:
UPDATE product_info p JOIN split_keys sk ON p.product_name LIKE CONCAT('%', sk.sub_key, '%') SET p.brands = sk.brands;
PostgreSQL 实现
利用内置函数直接拆分逗号分隔值并更新:
UPDATE product_info p SET brands = sk.brands FROM ( SELECT b.brands, TRIM(unnest(string_to_array(b.keys, ','))) AS sub_key FROM brand_mapping b ) sk WHERE p.product_name LIKE CONCAT('%', sk.sub_key, '%');
注意事项
- 如果同一个
product_name匹配到多个子关键词对应的不同brands,SQL会按执行顺序保留最后匹配到的brands值,和原Python循环逻辑一致。 - 实际使用时请替换示例表名(
product_info、brand_mapping)为你的真实表名。
内容的提问来源于stack exchange,提问作者Roshan
相关产品推荐
相关产品推荐

