基于MySQL正则表达式实现类似全库搜功能

一 需求

项目要做一个类似Elasticsearch全库搜的小功能,但是数据存放在MySQL里面,数据量不是很大,使用模糊查询性能也还可以接受。

一开始想直接用like,但是为了支持多个关键字查询,用like的话要循环字段进行拼装成如下的SQL语句:

SELECT * from tableName 
WHERE field_a like '%关键字1%' 
  OR field_a like '%关键字2%' 
  OR field_a like '%关键字3%' 
  OR field_b like '%关键字1%' 
  OR field_b like '%关键字2%' 
  OR field_b like '%关键字3%' 

但是还有其他多个字段都需要支持关键字搜索,循环拼装显然比较麻烦。

二 方法

然后想到之前有用过正则表达式查字段值匹配的方法,再次查看了下正则表达式用法,发现有个正则正好满足当前需求:

p1|p2|p3:  匹配 p1 或 p2 或 p3。
-- SQL语句
SELECT * FROM tableName WHERE field_a REGEXP 'key1|key2|key3';

使用正则这种写法就避免了循环拼装字段的麻烦。

实例查询如下:

SELECT * from t_cities 
WHERE city REGEXP '台|河' 
OR provinceid REGEXP '台|河' 

结果如下:
在这里插入图片描述
附:MySQL其他正则表达式用法在这里插入图片描述


参考:
1.MySQL 正则表达式

### 插入操作中的正则表达式MySQL 数据库中,正则表达式主要用于查询和更新语句中进行复杂的字符串匹配与处理。对于插入操作而言,并不会直接应用正则表达式来决定哪些数据应该被插入到表内;然而,在准备要插入的数据之前,可以利用正则表达式对输入值做验证或转换工作。 如果希望基于某些特定模式(比如电子邮件地址、电话号码等)过滤并插入符合条件的新记录,则可以在应用程序层面先使用编程语言提供的正则功能筛选合适的内容后再提交给 SQL 的 `INSERT` 命令[^1]。 另外一种情况是在插入过程中涉及到从现有字段派生新字段的情况时可能会间接用到正则表达式。例如: 假设有一个包含用户信息的表格 user_info, 其中含有 email 字段存储用户的邮箱地址。现在想要向该表新增一列 username 并设置默认值为email去掉@及其后的部分作为用户名初始化值: ```sql ALTER TABLE user_info ADD COLUMN username VARCHAR(255); UPDATE user_info SET username = SUBSTRING_INDEX(email, '@', 1); ``` 这里虽然没有直接调用 REGEXP 函数,但是通过内置函数实现类似的效果——即按照指定分隔符分割字符串获取前面的部分[^3]。 值得注意的是,上述例子并不是严格意义上的“使用正则表达式执行插入”,而是展示了如何借助其他手段达到目的。实际上,在标准的 INSERT INTO ... VALUES (...) 或者 INSERT INTO ... SELECT ... 结构里并不支持直接嵌套复杂逻辑如正则运算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值