[轉]sql like 通配符 模糊查詢技巧及特殊字符

                                                                                                                                          文章出處:sql like 通配符

    最近碰到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 語言字符串中的轉義字符 '/'。

    最後,看一個更加複雜的匹配


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章