使用LIKE通配符查询person表返回空结果的问题求助
解决LIKE语句带方括号查询返回空结果的问题
首先得明确一个关键知识点:你用的[b-g]、[^gkl]这种方括号语法,是SQL Server(以及微软Access等少数数据库)专属的LIKE通配符规则,用来匹配单个字符属于指定范围/集合,或者排除某个范围/集合。如果你的数据库是MySQL、PostgreSQL、SQLite这类主流数据库,它们根本不支持这个语法,自然会返回空结果——这是最可能的原因。
下面针对你的查询,分两种情况给出正确写法:
情况1:你用的是SQL Server(或支持方括号语法的数据库)
如果是这种情况,先检查你的查询写法有没有小问题,再核对数据是否符合条件:
- 你的
select * from person where surname not like "%[n,j,e,a]%"里,方括号里不需要加逗号,正确写法是surname not like '%[njea]%'——逗号会被当成普通字符匹配,而你的数据里大概率没有带逗号的surname,这会导致这个条件无法正确过滤目标字符;结合name not like 'P%',可能你的数据里所有记录要么name是P开头,要么surname包含n/j/e/a,所以返回空。 - 另外两个查询
select name from person where name like '%[^gkl]%'、select * from person where surname like '%[r-z]%'写法本身是对的,但要确认你的person表中确实存在符合条件的记录:比如有没有name里包含非g/k/l字符的?有没有surname里包含r到z之间字母的?如果数据本身没有,那返回空是正常的。
情况2:你用的是MySQL、PostgreSQL等不支持方括号的数据库
这类数据库需要用正则表达式来实现相同逻辑,替换成对应的正则函数:
- 原查询
select name from person where name like '%[^gkl]%'(匹配name包含非g/k/l的字符),改成正则写法:-- MySQL select name from person where name regexp '[^gkl]'; -- PostgreSQL select name from person where name ~ '[^gkl]'; - 原查询
select * from person where surname like '%[r-z]%'(匹配surname包含r-z之间的字符),改成:-- MySQL select * from person where surname regexp '[r-z]'; -- PostgreSQL select * from person where surname ~ '[r-z]'; - 原查询
select * from person where surname not like "%[n,j,e,a]%" and name not like "P%",改成:-- MySQL select * from person where surname not regexp '[njea]' and name not like 'P%'; -- PostgreSQL select * from person where surname !~ '[njea]' and name not like 'P%';
总结一下:先确认你的数据库类型,再对应调整查询语法,最后检查数据是否真的存在符合条件的记录,就能解决返回空结果的问题啦。
内容的提问来源于stack exchange,提问作者Daniel1490
相关产品推荐
相关产品推荐

