icyJ

SQL Server:SQL Like 的特殊用法

%:匹配零个及多个任意字符; _:与任意单字符匹配; []:匹配一个范围; [^]:排除一个范围

Symbol Meaning
like \'5[%]\' 5%
like \'[_]n\' _n
like \'[a-cdf]\' a, b, c, d, or f
like \'[-acdf]\' -, a, c, d, or f
like \'[[]\' [
like \']\' ]
like \'abc[_]d%\' abc_d and abc_de
like \'abc[def]\' abcd, abce, and abcf
like \'[^1-9]\' 0
like \'[^1-9b-z]\' 0, a

对于字符串中出现的特殊字符:\'%\',\'[\',\'[]\', \'_\' 可以使用 \'[]\' 把它们包含起来, 这样在匹配模式(pattern)中,它们就被当作普通字符对待了。

1. 用 like \'[[]\' 匹配特殊字符 \'[\'

select 1 where \'[ABCDE\' like \'[[]%\'

2. 用 like \']\' 匹配特殊字符 \']\'

select 1 where \']ABCDE\' like \']%\'

3. 用 like \'[[]]\' 匹配特殊字符 \'[]\'

select 1 where \'[]ABCDE\' like \'[[]]%%\'

4. 用 like \'[_]\' 匹配特殊字符 \'_\'

select 1 where \'_ABCDE\' like \'[_]%\'

5. 用 like \'[%]\' 匹配特殊字符 \'%\'

select 1 where \'ABC%DE\' like \'ABC[%]DE\'

对于其他的特殊字符:\'^\', \'-\', \']\' 因为它们本身在包含在 \'[]\' 中使用,所以需要用另外的方式来转义,于是就引入了 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 \'\\'

以上转载自:http://www.sqlstudy.com/sql_article.php?id=2008061601

 

SQL 通配符

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

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

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

通配符 描述
% 替代一个或多个字符
_ 仅替代一个字符
[charlist] 字符列中的任何单一字符

[^charlist]

或者

[!charlist]

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

原始的表 (用在例子中的):

Persons 表:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

使用 % 通配符

例子 1

现在,我们希望从上面的 "Persons" 表中选取居住在以 "Ne" 开始的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons WHERE City LIKE \'Ne%\'

结果集:

Id LastName FirstName Address City
2 Bush George Fifth Avenue New York

例子 2

接下来,我们希望从 "Persons" 表中选取居住在包含 "lond" 的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons WHERE City LIKE \'%lond%\'

结果集:

Id LastName FirstName Address City
1 Adams John Oxford Street London

使用 _ 通配符

例子 1

现在,我们希望从上面的 "Persons" 表中选取名字的第一个字符之后是 "eorge" 的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons WHERE FirstName LIKE \'_eorge\'

结果集:

Id LastName FirstName Address City
2 Bush George Fifth Avenue New York

例子 2

接下来,我们希望从 "Persons" 表中选取的这条记录的姓氏以 "C" 开头,然后是一个任意字符,然后是 "r",然后是任意字符,然后是 "er":

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons WHERE LastName LIKE \'C_r_er\'

结果集:

Id LastName FirstName Address City
3 Carter Thomas Changan Street Beijing

使用 [charlist] 通配符

例子 1

现在,我们希望从上面的 "Persons" 表中选取居住的城市以 "A" 或 "L" 或 "N" 开头的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons WHERE City LIKE \'[ALN]%\'

结果集:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York

例子 2

现在,我们希望从上面的 "Persons" 表中选取居住的城市不以 "A" 或 "L" 或 "N" 开头的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons WHERE City LIKE \'[!ALN]%\'

结果集:

Id LastName FirstName Address City
3 Carter Thomas Changan Street Beijing

 

以上转载自:http://www.w3school.com.cn/sql/sql_wildcards.asp

 

笔者代码:

实现需求:匹配并获取表格中第二列出现过某特殊字符的所有行。

代码:

create table #tbl(k int,v nvarchar(30))
insert into #tbl 
    select 1,\'1+中为1+2\' union select 2,\'1+中为+1\' union select 3,\'中为\' union select 4,\'中为+1\'

declare @x1 nvarchar(30)
set @x1 = \'中为\'

declare @prefix nvarchar(20)
set @prefix = \'[+!-*/()[!]<>,]\'

select * from #tbl where (v like \'%\'+@prefix+@x1+@prefix+\'%\' escape \'!\') or (v like @x1+@prefix+\'%\' escape \'!\') or (v like \'%\'+@prefix+@x1 escape \'!\') or (v = @x1) drop table #tbl

执行结果为:

2 1+中为+1
3 中为
4 中为+1

技术有限,本例中的查询语句后面的where语句用了三个or,只为匹配开头和结尾的特殊字符,代码比较笨重,同时会增加系统的开销。如果更好的实现方法,望多多指教!

分类:

技术点:

相关文章:

  • 2021-11-16
  • 2021-12-18
  • 2022-01-31
  • 2021-07-15
  • 2022-02-23
  • 2022-02-02
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-11-27
  • 2022-02-21
  • 2022-01-20
  • 2022-02-25
  • 2022-01-25
  • 2022-02-03
  • 2021-12-10
相关资源
相似解决方案