SQL中同一字段多字符串值关联数值计算问题求助
解决方案
你的问题出在原查询的CASE语句仅匹配完全等于单个book值的行,而当value列是分号分隔的多个值时,这个条件不成立,导致返回NULL。要实现需求,需要判断每个book是否存在于value字符串中,再累加对应的数值。
修改后的查询语句
WITH CM as ( SELECT Main.ID as ID, -- 累加每个存在的book对应的数值 (CASE WHEN CONCAT(';', Main.value, ';') LIKE '%;book1;%' THEN 5 ELSE 0 END) + (CASE WHEN CONCAT(';', Main.value, ';') LIKE '%;book2;%' THEN 8 ELSE 0 END) + (CASE WHEN CONCAT(';', Main.value, ';') LIKE '%;book3;%' THEN 2 ELSE 0 END) AS numb, time_m as time_m, Main.value FROM Main ) SELECT CM.ID, CM.numb, CM.time_m, CM.numb * CM.time_m as resu, CM.value FROM CM
关键说明
- 精确匹配判断:使用
CONCAT(';', Main.value, ';')给value两端加上分号,再用LIKE '%;bookX;%'匹配,可以避免类似book11被误判为book1的情况,确保只匹配完整的book名称。 - 数值累加:每个
CASE语句单独判断对应book是否存在,存在则返回对应数值,否则返回0,最后将这些值相加得到总numb。 - 计算结果:用总
numb乘以time_m得到最终的resu。
执行结果
执行上述查询后,会得到你期望的结果:
| ID | numb | time_m | resu | value |
|---|---|---|---|---|
| 32221 | 15 | 20 | 300 | book1;book2;book3 |
| 32222 | 13 | 15 | 195 | book1;book2 |
| 32233 | 5 | 20 | 100 | book1 |
内容的提问来源于stack exchange,提问作者lara M
相关产品推荐
相关产品推荐

