sql like 通配符 模糊查詢技巧及特殊字符mysql
1,SQL like對時間查詢的處理方法正則表達式
SQL數據表中有savetime(smalldatetime類型)字段,表中有兩條記錄,savetime值爲:2005-3-8 12:12:00和2005-6-6 14:02:02sql
我用下面語句什麼也搜不出來 select * from soft where soft.savetime like'%2005-3-8%'code
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%' 將找到匹配。"ip
後運行下面語句SELECT soft.*, CAST(soft.savetime AS varchar(20)) AS strdatetime, 發現 SQL把smalldatetime格試轉成: 03 8 2005 12:12PM字符串
我何用 like'%2005-3-8%'搜索到2005年3月8日全部的記錄?io
select * from soft where datediff(d,soft.savetime,convert(datetime,'20050308',121))=0table
select * from soft where convert(char(10),soft.savetime,121)='20050308'date
2, SQL對like 操做中的特殊字符處理方法:select
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' GO
意思就是: 好比,咱們要搜索一個字符串 "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
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)中,它們就被看成普通字符對待了。
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 ''
select max(ITEM_發文編號) from tlk_黨辦發文 where ITEM_發文編號 like N'%疾控發[[]2016]%'