MySQL多字符串筛选问题:如何提取不含指定字符串的姓名数据
解决SQL字符串包含过滤的问题
你的原语句是判断firstname或lastname完全等于'test'/'Guest'/'.'时排除,但你需要的是排除任意一列包含这些子串的记录,所以得用字符串包含判断的语法,不同数据库的写法略有差异:
通用SQL(适用于MySQL、SQL Server、PostgreSQL等多数数据库)
使用NOT LIKE搭配通配符%(代表任意长度的任意字符):
SELECT firstname, lastname FROM user WHERE -- firstname 不包含 test、Guest、. firstname NOT LIKE '%test%' AND firstname NOT LIKE '%Guest%' AND firstname NOT LIKE '%.%' -- lastname 同样不包含这些内容 AND lastname NOT LIKE '%test%' AND lastname NOT LIKE '%Guest%' AND lastname NOT LIKE '%.%';
简化写法(部分数据库支持正则)
如果你的数据库支持正则表达式(比如MySQL 8+、PostgreSQL),可以用正则简化条件,减少重复代码:
MySQL 8+ 写法
SELECT firstname, lastname FROM user WHERE firstname REGEXP 'test|Guest|\.' = 0 AND lastname REGEXP 'test|Guest|\.' = 0;
PostgreSQL 写法
SELECT firstname, lastname FROM user WHERE firstname !~* 'test|Guest|\.' AND lastname !~* 'test|Guest|\.';
(!~*表示不匹配正则且忽略大小写,若需区分大小写,改用!~)
关键说明
%是SQL标准通配符,%test%表示字符串任意位置包含'test'- 正则里的
|代表逻辑或,\.是转义后的点(点在正则中是匹配任意字符的特殊符号,必须转义才能匹配实际的点)
内容的提问来源于stack exchange,提问作者Mark Handy
相关产品推荐
相关产品推荐

