sql 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' 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

結果為: 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 語言字符串中的轉義字符 '\'。

最后,看一個更加復雜的匹配

select 1 where '[^A-Z]ABCDE' like '\[\^A\-Z\]%' escape '\'


免責聲明!

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



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