SQL Server中LIKE函数使用列值替代字符串的实现方案求助
解决SQL中使用列值进行LIKE匹配的问题
你需要筛选出sccholdername既不包含sfirstname也不包含slastname的记录,原语句存在三个关键问题:
- 拼写错误:
sccholddername应为sccholdername - LIKE未加通配符:直接用列值匹配LIKE只会在完全相等时成立,无法实现“包含”的匹配逻辑
- 逻辑运算符错误:用
OR会筛选出“不包含名或不包含姓”的记录,而你需要的是“既不包含名也不包含姓”,需改用AND
正确的LIKE实现语句
SELECT * FROM customers WHERE sccholdername NOT LIKE CONCAT('%', sfirstname, '%') AND sccholdername NOT LIKE CONCAT('%', slastname, '%');
CONCAT('%', 列名, '%')将列值包裹在通配符%中,实现“任意位置包含该值”的匹配AND确保两个条件同时满足,即记录的账户名既不包含名也不包含姓
针对示例数据的结果说明
这条语句会选中第一条记录(SCOTT DREWYOR),因为KENT/MICHELLE既不包含SCOTT也不包含DREWYOR;其余记录要么包含名要么包含姓,不会被筛选出来。
替代方案:使用字符串位置函数
如果你的数据库对CONCAT支持有限,或更倾向于用函数判断子字符串存在性,可使用以下方式:
MySQL/Oracle 版本
SELECT * FROM customers WHERE INSTR(sccholdername, sfirstname) = 0 AND INSTR(sccholdername, slastname) = 0;
INSTR返回子字符串在目标字符串中的起始位置,返回0表示不存在该子字符串
SQL Server 版本
SELECT * FROM customers WHERE CHARINDEX(sfirstname, sccholdername) = 0 AND CHARINDEX(slastname, sccholdername) = 0;
CHARINDEX功能与INSTR一致,返回0表示未找到子字符串
内容的提问来源于stack exchange,提问作者BBE
相关产品推荐
相关产品推荐

