SQL like与regexp区别

来源:互联网 发布:网线接入网络方式 编辑:程序博客网 时间:2024/05/21 08:55

在搜索数据库中的数据时,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使REGEXPb使[bB]bmysql>SELECTFROMpetWHEREnameREGEXP[bB];+++++++|name|owner|species|sex|birth|death|+++++++|Buffy|Harold|dog|f|19890513|NULL||Bowser|Diane|dog|m|19890831|19950729|+++++++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 ”

0 0
原创粉丝点击