最近碰到like模糊匹配的問題,找到一些答案接觸迷惑,覺得有知識是自己忽略的,現在整理出來,既強化記憶,又是一次記錄,以下轉自一篇Blog,關于sql server like的通配符和字符帶通配符的處理辦法。
1. SQL like對時間查詢的處理方法
SQL數據表中有savetime(smalldatetime類型)字段,表中有兩條記錄,savetime值為:2005-3-8 12:12:00和2005-6-6 14:02:02 我用下面語句什么也搜不出來 select * from soft where soft.savetime like'%2005-3-8%' SQL幫助中說: "當搜索 datetime 值時,推薦使用 LIKE,因為 datetime 項可能包含各種日期部分。例如,如果將值 19981231 9:20 插入到名為 arrival_time 的列中,則子句 WHERE arrival_time = 9:20 將無法找到 9:20 字符串的精確匹配,因為 SQL Server 將其轉換為 1900 年 1 月 1 日上午 9:20。然而,子句 WHERE arrival_time LIKE '%9:20%' 將找到匹配。" 后運行下面語句SELECT soft.*, CAST(soft.savetime AS varchar(20)) AS strdatetime, 發現SQL把smalldatetime格試轉成:03 8 2005 12:12PM 我何用 like'%2005-3-8%'搜索到2005年3月8日所有的記錄?
select * from soft where datediff(d,soft.savetime,convert(datetime,'20050308',121))=0 ---- select * from soft where convert(char(10),soft.savetime,121)='20050308'
2. SQL對like 操作中的特殊字符處理方法:
SQL Server查詢過程中,單引號 ' 是特殊字符,所以在查詢的時候要轉換成雙單引號 '' 。
在like操作還有以下特殊字符:下劃線_,百分號%,方括號[],尖號^。
其用途如下:
下劃線:用于代替一個任意字符(相當于正則表達式中的 ? )
百分號:用于代替任意數目的任意字符(相當于正則表達式中的 * )
方括號:用于轉義(事實上只有左方括號用于轉義,右方括號使用最近優先原則匹配最近的左方括號)
尖號:用于排除一些字符進行匹配(這個與正則表達式中的一樣)
以下是一些匹配的舉例,需要說明的是,只有like操作才有這些特殊字符,=操作是沒有的。
a_b... a[_]b%
a%b... a[%]b%
a[b... a[[]b%
a]b... a]b%
a[]b... a[[]]b%
a[^]b... a[[][^]]b%
a[^^]b... a[[][^][^]]b%
在實際進行處理的時候,對于=操作,我們一般只需要如此替換:
' -> ''
對于like操作,需要進行以下替換(注意順序也很重要)
[ -> [[] (這個必須是第一個替換的!!)
% -> [%] (這里%是指希望匹配的字符本身包括的%而不是專門用于匹配的通配符)
_ -> [_]
^ -> [^]
3,SQL Like 通配符特殊用法:Escape
闡述Escape 的作用:
1.使用 ESCAPE 關鍵字定義轉義符。在模式中,當轉義符置于通配符之前時,該通配符就解釋為普通字符。例如,要搜索在任意位置包含字符串 5% 的字符串,請使用: WHERE ColumnA LIKE '%5/%%' ESCAPE '/' 但是在MySQL中好像不能使用"/"。 2.ESCAPE 'escape_character' 允許在字符串中搜索通配符而不是將其作為通配符使用。escape_character 是放在通配符前表示此特殊用途的字符。 SELECT * FROM finances WHERE description LIKE 'gs_' ESCAPE 'S' 意思就是: 比如,我們要搜索一個字符串 "g_" ,如果直接 like "g_",那么 "_"的作用就是通配符,而不是字符,結果,我們會查到比如 "ga","gb","gc",而不是我們需要的 "g_". 用 LIKE 'gs_' ESCAPE 'S' 's'表示特殊用法標志
3.create table a (name varchar(10)) go insert into a select '11%22' union all select '11%33' union all select '12%33' go select * from a WHERE name LIKE '%/%33' ESCAPE '/' --指定用'/'符號來說明跟在其后面的通配符字符為普能字符。(第二個%是字符不是通配符來的) go drop table a
結果為: name ---------- 11%33 12%33
總結:
%:匹配零個及多個任意字符; _:與任意單字符匹配; []:匹配一個范圍; [^]:排除一個范圍
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 語言字符串中的轉義字符 '/'。
最后,看一個更加復雜的匹配
新聞熱點
疑難解答