如何结合条件表达式检查子字符串匹配并填充BRANDS字段?
SQL逻辑实现解决方案
需求说明
需对合并后的表执行以下逻辑:
- 筛选出
Keyword存在于Names字段中的记录 - 对筛选后的记录按规则更新
BRANDS字段:- 若
SUPPLIER1为空或等于<NA>,则BRANDS设为YES - 若
SUPPLIER1不为空,且Supplier与SUPPLIER1相等,则BRANDS设为2*Yes - 其他情况保持
BRANDS原内容不变
- 若
原始数据
| Names | Supplier | Company1 | Keyword | SUPPLIER1 | BRANDS |
|---|---|---|---|---|---|
| ADIDAS PREDATOR 17.1 | ADIDAS | PREDATOR | |||
| NIKE MERCURIAL 2020 | NIKE | PREDATOR | |||
| NIKE VAPOR 2021 | NIKE | PREDATOR | |||
| NEW BALANCE FURON | JD | PREDATOR | |||
| PUMA RAPIDO 21.3 | STADIUM | PREDATOR | |||
| ADIDAS PREDATOR 17.1 | ADIDAS | PREDATOR | ADIDAS | ||
| ADIDAS PREDATOR 17.1 | ADIDAS | PREDATOR | JD |
完整SQL代码
SELECT Names, Supplier, Company1, Keyword, SUPPLIER1, CASE -- 先判断Keyword是否包含在Names中 WHEN Names LIKE '%' || Keyword || '%' THEN CASE -- SUPPLIER1为空或为<NA>时,赋值YES WHEN SUPPLIER1 IS NULL OR SUPPLIER1 = '<NA>' THEN 'YES' -- SUPPLIER1与Supplier相等时,赋值2*Yes WHEN SUPPLIER1 = Supplier THEN '2*Yes' -- 其他情况保留原BRANDS值 ELSE BRANDS END -- 不满足Keyword在Names中的记录,保留原BRANDS值 ELSE BRANDS END AS BRANDS FROM TABLE;
代码说明
- 筛选逻辑:通过
Names LIKE '%' || Keyword || '%'判断Keyword是否包含在Names中,嵌套在CASE外层确保仅符合条件的记录触发BRANDS赋值逻辑。 - BRANDS赋值逻辑:
- 内层CASE先校验
SUPPLIER1状态,为空或等于<NA>时返回YES - 若
SUPPLIER1不为空,对比Supplier与SUPPLIER1,相等则返回2*Yes - 不符合上述条件的记录,保留原
BRANDS字段内容
- 内层CASE先校验
- 若无需保留全部原始字段,可按需调整SELECT后的字段列表,但需保证逻辑完整性。
目标输出
| Names | Supplier | Company1 | Keyword | SUPPLIER1 | BRANDS |
|---|---|---|---|---|---|
| ADIDAS PREDATOR 17.1 | ADIDAS | PREDATOR | YES | ||
| NIKE MERCURIAL 2020 | NIKE | PREDATOR | |||
| NIKE VAPOR 2021 | NIKE | PREDATOR | |||
| NEW BALANCE FURON | JD | PREDATOR | |||
| PUMA RAPIDO 21.3 | STADIUM | PREDATOR | |||
| ADIDAS PREDATOR 17.1 | ADIDAS | PREDATOR | ADIDAS | 2*Yes | |
| ADIDAS PREDATOR 17.1 | ADIDAS | PREDATOR | JD |
内容的提问来源于stack exchange,提问作者Roshan
相关产品推荐
相关产品推荐

