使用MySQL正则表达式与通配符

2019/09/27


数据准备

CREATE TABLE IF NOT EXISTS products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    prod_name VARCHAR(255) NOT NULL
);

INSERT INTO products(prod_name) VALUES('5X 100');
INSERT INTO products(prod_name) VALUES('5X 200');
INSERT INTO products(prod_name) VALUES('5X 300');
INSERT INTO products(prod_name) VALUES('3X 200');
INSERT INTO products(prod_name) VALUES('5.5X 300');
INSERT INTO products(prod_name) VALUES('8.5X 20');
INSERT INTO products(prod_name) VALUES('facewash');


基本字符匹配

如何检索列prod_name包含文本100的所有行?

SELECT * FROM products WHERE prod_name REGEXP '100'

LIKEREGEXP的区别是什么?

我们先来看一段SQL

SELECT * FROM products WHERE prod_name LIKE '100'

它没有返回任何数据?为什么?

因为LIKE匹配的是整个列,如果被匹配的文本在列值中出现,LIKE操作符也不会找到它。而REGEXP列值中进行匹配,所以会有相应的数据返回。如果我就想用LIKE返回列值中包含100的数据,应该怎么办? 使用通配符

SELECT * FROM products WHERE prod_name LIKE '%100';
SELECT * FROM products WHERE prod_name LIKE '_X 100';



or匹配

如何检索列prod_name包含文本100或200的所有行。

SELECT * FROM products WHERE prod_name REGEXP '100|200'


匹配几个字符之一

SELECT * FROM products WHERE prod_name REGEXP '5X [12]00'


匹配范围

SELECT * FROM products WHERE prod_name REGEXP '5x [1-9]00'


匹配特殊字符

SELECT * FROM products WHERE prod_name REGEXP '.'

很明显,这不是期望的结果。因为.匹配任意字符,而我们只想找出包含.字符的值,所以我们需要用到转义。

SELECT * FROM products WHERE prod_name REGEXP '\\.'


匹配字符类

SELECT * FROM products WHERE prod_name REGEXP '\\.[:digit:][:alpha:]'


匹配多个实例

检索包含8个字母的值。

SELECT * FROM products WHERE prod_name REGEXP '[:alpha:]{8}'


定位符

匹配以8开头,0结尾的值。

SELECT * FROM products WHERE prod_name REGEXP '^8.*0$'

参考

  • 《MySQL必知必会》 第八章 - 用通配符进行过滤
  • 《MySQL必知必会》 第九章 - 用正则表达式进行搜索


一位喜欢提问、尝试的程序员

(转载本站文章请注明作者和出处 姚屹晨-yaoyichen

Post Directory