TSQL語句中的Like用法


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM