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,只為匹配開頭和結尾的特殊字符,代碼比較笨重,同時會增加系統的開銷。如果更好的實現方法,望多多指教!