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,只为匹配开头和结尾的特殊字符,代码比较笨重,同时会增加系统的开销。如果更好的实现方法,望多多指教!