如何解决SQL CASE条件中LIKE匹配分类名称的冲突问题
解决SQL CASE语句的匹配优先级问题
核心问题出在CASE表达式的匹配逻辑:它是从上到下依次判断,只要匹配到第一个满足条件的分支就会立即返回结果,不会继续检查后续分支。因为'Johnny'字符串本身包含'John',所以你的原查询里第一个LIKE '%John%'会把两条记录都命中,导致所有结果都是'A'。
另外注意两个细节:你的表列是Name,但原查询里写的是first_name,这会导致列不存在的错误;Group是SQL的保留关键字,作为别名时最好用反引号(MySQL)或双引号(PostgreSQL等)包裹,避免语法报错。
修正后的查询(精确匹配推荐)
如果你的数据就是固定的John和Johnny,直接用精确匹配更高效:
SELECT Name, CASE WHEN Name = 'Johnny' THEN 'B' WHEN Name = 'John' THEN 'A' ELSE NULL END AS `Group` FROM Customers;
如果必须使用LIKE(比如有其他相似名称变种)
把更长、更具体的匹配条件放在前面:
SELECT Name, CASE WHEN Name LIKE '%Johnny%' THEN 'B' WHEN Name LIKE '%John%' THEN 'A' ELSE NULL END AS `Group` FROM Customers;
这样执行时,Johnny会先匹配到第一个分支返回'B',剩下的John才会匹配第二个分支返回'A',符合你的预期输出。
内容的提问来源于stack exchange,提问作者Captain_Cold
相关产品推荐
相关产品推荐

