SQL查询问题:筛选含字符c且首尾非c的title结果异常排查
问题出在逻辑运算符的使用上
你写的条件(b.title not like 'c%' or b.title not like '%c')是错误的,这就是为什么还会出现首字符为c的title。给你拆解下逻辑:
- 当某个title以c开头但结尾不是c时,
not like '%c'这个条件是成立的,OR逻辑只要有一个条件为真,整个表达式就为真,所以这条不符合需求的记录会被筛选出来。 - 你的真实需求是:title包含c,同时c不在开头也不在结尾,所以这里必须用
AND而不是OR。
修正后的SQL语句
select p.name as publisher, b.title, b.name as name_ from book b join publisher p on b.idpublisher = p.idpublisher where b.title like '%c%' and b.title not like 'c%' and b.title not like '%c';
另外建议你用显式的JOIN语法代替旧的逗号分隔表的写法,这样代码可读性更好,也更容易维护。
额外的实现方式(Oracle专属)
既然你用的是Oracle SQL Developer,还可以用正则表达式来实现,写法更直观:
select p.name as publisher, b.title, b.name as name_ from book b join publisher p on b.idpublisher = p.idpublisher where regexp_like(b.title, '^[^c].*c.*[^c]$');
这个正则的含义是:
^[^c]:开头字符不是c.*c.*:字符串中间包含c[^c]$:结尾字符不是c
内容的提问来源于stack exchange,提问作者Aljaž
相关产品推荐
相关产品推荐

