能否用CASE语句判断列是否以指定列表值开头?IN加通配符失效如何处理
问题解答
核心结论
不能在IN运算符中使用通配符,因为IN只做精确值匹配,不会解析%这类通配符,所以你写的CASE条件永远不会触发NEW_NAME分支。
替代方案
根据你使用的数据库,推荐以下几种简化写法:
1. 支持LIKE ANY的数据库(如PostgreSQL)
这是最接近你需求的“一行式”写法:
CASE WHEN COLUMN LIKE ANY ('{AAA%, WWW%, XXX%, YYY%, ZZZ%}') THEN NEW_NAME ELSE COLUMN END
2. MySQL/MariaDB
可以用正则表达式匹配前缀:
CASE WHEN COLUMN REGEXP '^(AAA|WWW|XXX|YYY|ZZZ)' THEN NEW_NAME ELSE COLUMN END
如果不想用正则,也可以用OR连接多个LIKE(逻辑清晰,也可以写成一行):
CASE WHEN COLUMN LIKE 'AAA%' OR COLUMN LIKE 'WWW%' OR COLUMN LIKE 'XXX%' OR COLUMN LIKE 'YYY%' OR COLUMN LIKE 'ZZZ%' THEN NEW_NAME ELSE COLUMN END
3. SQL Server
可以用STRING_SPLIT结合子查询实现动态匹配:
CASE WHEN EXISTS ( SELECT 1 FROM STRING_SPLIT('AAA,WWW,XXX,YYY,ZZZ', ',') WHERE COLUMN LIKE CONCAT(value, '%') ) THEN NEW_NAME ELSE COLUMN END
或者用PATINDEX函数替代多个LIKE:
CASE WHEN PATINDEX('AAA%', COLUMN) > 0 OR PATINDEX('WWW%', COLUMN) > 0 OR PATINDEX('XXX%', COLUMN) > 0 OR PATINDEX('YYY%', COLUMN) > 0 OR PATINDEX('ZZZ%', COLUMN) > 0 THEN NEW_NAME ELSE COLUMN END
内容的提问来源于stack exchange,提问作者Kale
相关产品推荐
相关产品推荐

