首页 > 技术文章 > MySQL SQL模式匹配

jevo 2013-08-25 19:58 原文

MySQL提供标准的SQL模式匹配,SQL模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零字符)。。

关于SQL模式匹配:http://dev.mysql.com/doc/refman/5.1/zh/tutorial.html#pattern-matching

1.MySQL仅仅支持多数正则表达式实现的一个很小的子集。

2.SQL模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零字符)。;而REGEXP使用扩展正则表达式匹配列值的子串,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。

注意使用SQL模式时,不能使用=或!=;而应使用LIKE或NOT LIKE比较操作符。

看下面的例子:

mysql> select * from tb;

+----+------------+-----+

| id | Name       | Age |

+----+------------+-----+

|  1 | changename |  20 |

+----+------------+-----+

1 row in set (0.02 sec)

要想找出正好包含5个字符的名字,使用“_”模式字符:

mysql> select * from tb where name like '_____';

Empty set (0.61 sec)

包含10个字符时,找出了匹配结果。

mysql> select * from tb where name like '__________';

+----+------------+-----+

| id | Name       | Age |

+----+------------+-----+

|  1 | changename |  20 |

+----+------------+-----+

1 row in set (0.00 sec)

 

mysql> select name from tb where name regexp 'cha';

+------------+

| name       |

+------------+

| changename |

+------------+

1 row in set (0.06 sec)

 

mysql> select name from tb where name regexp 'chad';

Empty set (0.00 sec)

 

扩展正则表达式的一些字符是:

·         ‘.’匹配任何单个的字符。

·         字符类“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。为了命名字符的范围,使用一个“-”。“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。

·         “ * ”匹配零个或多个在它前面的字符。例如,“x*”匹配任何数量的“x”字符,“[0-9]*”匹配任何数量的数字,而“.*”匹配任何数量的任何字符。

    •  如果REGEXP模式与被测试值的任何地方匹配,模式就匹配(这不同于LIKE模式匹配,只有与整个值匹配,模式才匹配)。

    •  为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。

 

3.默认MySQL中的正则表达式匹配不区分大小写,可使用BINARY关键字区分大小写,如

mysql> select name from tb where name regexp binary'cha';

+------------+

| name       |

+------------+

| changename |

+------------+

1 row in set (0.08 sec)

 

mysql> select name from tb  where name regexp binary'Cha';

Empty set (0.00 sec)

 

4、进行OR匹配:为搜索两个串之一,使用|,如下所示:

mysql> select name from tb where name regexp 'c|a';

+------------+

| name       |

+------------+

| changename |

+------------+

1 row in set (0.02 sec)

 

5、匹配几个字符之一:

匹配任何单一字符。如下所示:

mysql> select name from tb where name regexp '[ca]';

+------------+

| name       |

+------------+

| changename |

+------------+

1 row in set (0.02 sec)

 

正如所见,[]是另一种形式的OR语句。'[ca]'与’c|a’是等价的。

 

匹配除给定字符外的字符:

 mysql> select name from tb where name regexp '^[ca]';

+------------+

| name       |

+------------+

| changename |

+------------+

1 row in set (0.00 sec)

 

6、可使用-来定义一个范围。如[1-9],[a-b]。

mysql> select name from tb where name regexp '[a-c]';

+------------+

| name       |

+------------+

| changename |

+------------+

1 row in set (0.00 sec)

 

mysql> select name from tb where name regexp '[w-z]';

Empty set (0.00 sec)

 

7、为了匹配特殊字符,必须用\\为前导,例如\\-,\\.等。这种处理即转义(escaping)。

多数正则表达式实现使用单个反斜杠转义特殊字符,但MYSQL要求两个(MYSQL自己解释一个,正则表达式库解释另一个)。

\\也用来引用元字符(具有特殊含义的字符),如下表:

 

 

8、为了更方便工作,可以使用预定义的字符集,称为字符类(character class)。

mysql> select name from tb where name regexp '[[:alpha:]]';

+------------+

| name       |

+------------+

| changename |

+------------+

1 row in set (0.00 sec)

 

9、使用正则表达式重复元字符匹配多个实例:

mysql> select name from tb where name regexp 'c{1}';

+------------+

| name       |

+------------+

| changename |

+------------+

1 row in set (0.00 sec)

 

mysql> select name from tb where name regexp 'c{2}';

Empty set (0.00 sec)

 

10、定位符(为了匹配特定位置的文本):

 mysql> select name from tb where name regexp 'e$';

+------------+

| name       |

+------------+

| changename |

+------------+

1 row in set (0.00 sec)

 

mysql> select name from tb where name regexp 'a$';

Empty set (0.00 sec)



 

11、使REGEXP起类似LIKE的作用,它们的区别在于LIKE匹配整个串而REGEXP匹配子串。利用定位符,通过用^开始每个表达式,用$结束每个表达式。

 

12、简单的正则表达式测试:可以在不使用数据库表的情况下用SELECT来测试正则表达式。REGEXP检查总是返回0或1(匹配)。

 

[sql] 

mysql> select 'hello' REGEXP'[0-9]';  

+------------------------+  

| 'hello' REGEXP '[0-9]' |  

+------------------------+  

|                      0 |  

+------------------------+  

1 row in set (0.00 sec)  

 

本文基于 <使用正则表达式搜索>整理形成。

官方文档:Mysql正则表达式:http://dev.mysql.com/doc/refman/5.1/zh/regexp.html

 

 

推荐阅读