php sql中regexp,SQl中LIKE模糊查询与REGEXP用法

文章详细的介绍了SQl中LIKE模糊查询与REGEXP各种用法及对特殊字符的一些用法,有需要的朋友可参考一下。

在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符。

SQL 通配符必须与 LIKE 运算符一起使用。

在 SQL 中,可使用以下通配符:

通配符 描述

% 替代一个或多个字符

_ 仅替代一个字符

[charlist] 字符列中的任何单一字符

[^charlist]

或者

[!charlist]

不在字符列中的任何单一字符

-- SQL模糊查询,使用like比较字,加上SQL里的通配符,请参考以下:

-- 1、LIKE'Mc%' 将搜索以字母 Mc 开头的所有字符串(如 McBadden)。

-- 2、LIKE'%inger' 将搜索以字母 inger 结尾的所有字符串(如 Ringer、Stringer)。

-- 3、LIKE'%en%' 将搜索在任何位置包含字母 en 的所有字符串(如 Bennet、Green、McBadden)。

-- 4、LIKE'_heryl' 将搜索以字母 heryl 结尾的所有六个字母的名称(如 Cheryl、Sheryl)。

-- 5、LIKE'[CK]ars[eo]n' 将搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。

-- 6、LIKE'[M-Z]inger' 将搜索以字符串 inger 结尾、以从 M 到 Z 的任何单个字母开头的所有名称(如 Ringer)。

-- 7、LIKE'M[^c]%' 将搜索以字母 M 开头,并且第二个字母不是 c 的所有名称(如MacFeather)。

提到Like语句大家都很熟悉,比如查找用户名包含有"c"的所有用户, 我们可以用 use mydatabase

代码如下

复制代码

select * from table1 where username like'%c%"

--查询包含%并且以A-Z结尾的数据

SELECT TOP 100 * FROM dbo.TableName WITH(NOLOCK)

WHERE colName LIKE '%%%[A-Z]' escape ''

--查询以%结尾的数据

SELECT TOP 100 * FROM dbo.TableName WITH(NOLOCK)

WHERE colName LIKE '%%%' escape ''

--查询包含50'的数据

SELECT TOP 100 * FROM dbo.TableName WITH(NOLOCK)

WHERE colName LIKE '%50''%'

--查询包含'的数据

SELECT TOP 100 * FROM dbo.TableName WITH(NOLOCK)

WHERE colName LIKE '%''%'

--查询包含有下划线的colValue

SELECT TOP 100 * FROM dbo.TableName WITH(NOLOCK)

WHERE colName LIKE '%_%' ESCAPE ''

--查询包含有破折号的colValue

--LIKE '%-%--%'中的第一个破折号实际退出字符,紧接后面的%是常量字符数据值;

--第二个破折号是退出字符;

--第三个破折号是常量字符数据值。

SELECT TOP 100 * FROM dbo.TableName WITH(NOLOCK)

WHERE colName LIKE '%-%--%' ESCAPE '-'

--查询开头不是a-z,以e结尾的数据

SELECT TOP 100 * FROM dbo.TableName WITH(NOLOCK)

WHERE colName LIKE '[a-z]e'

--查询以tes开头,不以t-e结尾的数据

SELECT TOP 100 * FROM dbo.TableName WITH(NOLOCK)

WHERE colName LIKE 'tes[^t-e]%'

--查询第二个字母是A的colValue

SELECT TOP 10 * FROM dbo.TableName WITH(NOLOCK)

WHERE colName LIKE '_A%'

--查询第三个字符为A,且长度为20个字符的colValue

SELECT TOP 10 * FROM dbo.TableName WITH(NOLOCK)

WHERE colName LIKE '__ayboy - Naked Sins'

REGEX用法

“.”匹配任何单个的字符。

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

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

正则表达式是区分大小写的,但是如果你希望,你能使用一个字符类匹配两种写法。例如,“[aA]”匹配小写或大写的“a”而“[a-zA-Z]”匹配两种写法的任何字母。

如果它出现在被测试值的任何地方,模式就匹配(只要他们匹配整个值,SQL模式匹配)。

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

为了说明扩展正则表达式如何工作,上面所示的LIKE查询在下面使用REGEXP重写:

为了找出以“b”开头的名字,使用“^”匹配名字的开始并且“[bB]”匹配小写或大写的“b”:

代码如下

复制代码

mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";

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

| name | owner | species | sex | birth | death |

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

| Buffy | Harold | dog | f | 1989-05-13 | NULL |

| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |

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

为了找出以“fy”结尾的名字,使用“$”匹配名字的结尾:

mysql> SELECT * FROM pet WHERE name REGEXP "fy$";

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

| name | owner | species | sex | birth | death |

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

| Fluffy | Harold | cat | f | 1993-02-04 | NULL |

| Buffy | Harold | dog | f | 1989-05-13 | NULL |

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

为了找出包含一个“w”的名字,使用“[wW]”匹配小写或大写的“w”:

mysql> SELECT * FROM pet WHERE name REGEXP "[wW]";

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

| name | owner | species | sex | birth | death |

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

| Claws | Gwen | cat | m | 1994-03-17 | NULL |

| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |

| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |

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

charindex另一种写法:

代码如下

复制代码

use mydatabase

select * from table1 where charindex('c',username)>0

这种方法理论上比上一种方法多了一个判断语句,即>0, 但这个判断过程是最快的, 我相信80%以上的运算都是花在查找字符串及其它的运算上, 所以运用charindex函数也没什么大不了。用这种方法也有好处, 那就是对%,|等在不能直接用like 查找到的字符中可以直接在这charindex中运用, 如下:

代码如下

复制代码

use mydatabase

select * from table1 where charindex('%',username)>0

大家还可以写成:

代码如下

复制代码

use mydatabase

select * from table1 where charindex(char(37),username)>0

ASCII的字符即为%

SQL Like 的特殊字符

对于其他的特殊字符:'^', '-', ']' 因为它们本身在包含在 '[]' 中使用,所以需要用另外的方式来转义,于是就引入了 like 中的 escape 子句,另外值得注意的是:escape 可以转义所有的特殊字符。

代码如下

复制代码

select 1 where '^ABCDE' like '!^ABCDE' escape '!'

select 1 where '-ABCDE' like '!-ABCDE' escape '!'

select 1 where ']ABCDE' like '!]ABCDE' escape '!'

select 1 where '%ABCDE' like '%ABCDE' escape ''

select 1 where '%ABCDE' like '!%ABCDE' escape '!'

select 1 where '%ABCDE' like '#%ABCDE' escape '#'

select 1 where '%ABCDE' like '@%ABCDE' escape '@'

select 1 where '[ABCDE' like '![ABCDE' escape '!'

select 1 where ']ABCDE' like '!]ABCDE' escape '!'

看出规律了吧,就是用 escape 后面紧跟着的字符来做转义字符。 escape 后面的字符相当于 C 语言字符串中的转义字符 ''。

最后,看一个更加复杂的匹配

代码如下

复制代码

select 1 where '[^A-Z]ABCDE' like '[^A-Z]%' escape ''

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值