为何MariaDB中NOT LIKE查询返回不符合预期的结果?
问题原因与解决方案
你的问题核心是MariaDB(及MySQL)的LIKE语法不支持[0-9]或[a-zA-Z]这类字符范围匹配——这种方括号的写法是SQL Server等数据库的专属语法,在MariaDB里,它会把[0-9]当成普通字符串字面量处理。所以你写的NOT LIKE '%[0-9]%'只会排除包含[0-9]这个具体子串的记录,而纯数字的5601、52000987里根本没有这个子串,自然不会被排除,最终返回了除whouse外的所有记录。
要实现「排除纯数字location,保留含字符(可带数字)的记录」的需求,你需要用MariaDB支持的正则表达式匹配(REGEXP或RLIKE关键字等价),以下是两种常用有效写法:
写法一:排除全数字记录
用正则^[0-9]+$表示「从开头到结尾全是1个或多个数字」,加上NOT直接排除这类记录:
SELECT *, SUM(quantity) OVER (PARTITION BY partName) AS pCount FROM activepartslist INNER JOIN masterpartslist ON activepartslist.mpID = masterpartslist.mpID WHERE location != 'whouse' AND NOT location REGEXP '^[0-9]+$' ORDER BY partName, serialNumber;
写法二:匹配含非数字字符的记录
用正则[^0-9]表示「任意一个非数字字符」,只要location里存在这类字符,就符合你要保留的条件(比如Pinpad-7里的-和字母、Refrigerator里的字母):
SELECT *, SUM(quantity) OVER (PARTITION BY partName) AS pCount FROM activepartslist INNER JOIN masterpartslist ON activepartslist.mpID = masterpartslist.mpID WHERE location != 'whouse' AND location REGEXP '[^0-9]' ORDER BY partName, serialNumber;
两种写法效果一致,按需选择即可。
内容的提问来源于stack exchange,提问作者I.Tornquist
相关产品推荐
相关产品推荐

