<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    巷尾的酒吧

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      64 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

    #

         摘要: l        方括號(hào)表達(dá)示方括號(hào)表達(dá)式描述[[:alnum:]]字母和數(shù)字混合的字符[[:alpha:]]字母字符[[:cntrl:]]控制字符[[:digit:]]數(shù)字字符[[:graph:]]圖像字符[[:lower:]]小寫字母字符[[:print:]]打印字符[[:punct:]]標(biāo)點(diǎn)符號(hào)字符[[:spac...  閱讀全文
    posted @ 2012-10-11 20:06 abing 閱讀(293) | 評(píng)論 (0)編輯 收藏

    簡(jiǎn)要比較:

          replace 字符串級(jí)別的代替

         如:SELECT REPLACE('accd','cd','ef') from dual; --> aefd

     

         translate 字符級(jí)別的代替

         如:select translate('acdd','cd','ef') from dual; -->aeff


    replace('將要更改的字符串','被替換掉的字符串','替換字符串')

    例:select  replace ('111222333444','222','888') from dual;

    輸出為 '111888333444'


    分別詳解

         replace:

         語(yǔ)法:REPLACE(char,search_string[,replacement_string])

         解釋:replace中,每個(gè)search_string都被replacement_string所代替

            select replace('acdd','cd','ef') from dual; --> aefd

     

         如果replacement_string為空或?yàn)閚ull,那么所有的search_string都被移除

         select replace('acdd','cd','') from dual; --> ad

     

         如果search_string 為null,那么就返回原來的char

         select replace('acdd','ef') from dual; -->acdd

         select replace('acdd','','') from dual; -->acdd(也是兩者都為空的情況)

     

     

          translate:

          語(yǔ)法:TRANSLATE('char','from_string','to_string')

          解釋:translate中,每個(gè)from_string中的字符被to_string中

            

            舉例說明:


            select translate('asd12fg','12','55') from dual

    posted @ 2012-10-11 19:55 abing 閱讀(211) | 評(píng)論 (0)編輯 收藏

    oracle的substr函數(shù)的用法
     取得字符串中指定起始位置和長(zhǎng)度的字符串   substr( string, start_position, [ length ] )
     如:
         substr('This is a test'62)     would return 'is'
         substr('This is a test'6)     would return 'is a test'
         substr('TechOnTheNet'-33)     would return 'Net'
         substr('TechOnTheNet'-63)     would return 'The'

      select substr('Thisisatest', -4, 2) value from dual    結(jié)果是   te

    select substr('emros',-3,1) value from dual      結(jié)果是 r

     

    substr('abcde',-6) = null
    substr('abcde',-5) = 'abcde'
    substr('abcde',-4) = 'bcde'
    substr('abcde',-3) = 'cde'
    substr('abcde',-2) = 'de'
    substr('abcde',-1) = 'e'
    substr('abcde',-0) = 'abcde'

    posted @ 2012-10-11 17:49 abing 閱讀(223) | 評(píng)論 (0)編輯 收藏

    INSTR

      (源字符串, 目標(biāo)字符串, 起始位置, 匹配序號(hào))

      在Oracle/PLSQL中,instr函數(shù)返回要截取的字符串在源字符串中的位置。只檢索一次,就是說從字符的開始

      到字符的結(jié)尾就結(jié)束。

      語(yǔ)法如下:

      instr( string1, string2 [, start_position [, nth_appearance ] ] )

      參數(shù)分析:

      string1

      源字符串,要在此字符串中查找。

      string2

      要在string1中查找的字符串.

      start_position

      代表string1 的哪個(gè)位置開始查找。此參數(shù)可選,如果省略默認(rèn)為1. 字符串索引從1開始。如果此參數(shù)為正,從左到右開始檢索,如果此參數(shù)為負(fù),從右到左檢索,返回要查找的字符串在源字符串中的開始索引。

      nth_appearance

      代表要查找第幾次出現(xiàn)的string2. 此參數(shù)可選,如果省略,默認(rèn)為 1.如果為負(fù)數(shù)系統(tǒng)會(huì)報(bào)錯(cuò)。

      注意:

      如果String2在String1中沒有找到,instr函數(shù)返回0.



    示例如下:

    select instr('adsda','a') from dual
    select instr('adsda','a',1,2) from dual
    select instr('adsda','a',-1,2) from dual






    posted @ 2012-10-11 17:46 abing 閱讀(187) | 評(píng)論 (0)編輯 收藏

    ORACLE中的支持正則表達(dá)式的函數(shù)主要有下面四個(gè):
    1,REGEXP_LIKE :與LIKE的功能相似
    2,REGEXP_INSTR :與INSTR的功能相似
    3,REGEXP_SUBSTR :與SUBSTR的功能相似
    4,REGEXP_REPLACE :與REPLACE的功能相似
    它們?cè)谟梅ㄉ吓cOracle SQL 函數(shù)LIKE、INSTR、SUBSTR 和REPLACE 用法相同,
    但是它們使用POSIX 正則表達(dá)式代替了老的百分號(hào)(%)和通配符(_)字符。
    POSIX 正則表達(dá)式由標(biāo)準(zhǔn)的元字符(metacharacters)所構(gòu)成:
    '^' 匹配輸入字符串的開始位置,在方括號(hào)表達(dá)式中使用,此時(shí)它表示不接受該字符集合。
    '$' 匹配輸入字符串的結(jié)尾位置。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,則 $ 也匹
    配 '\n' 或 '\r'。
    '.' 匹配除換行符之外的任何單字符。
    '?' 匹配前面的子表達(dá)式零次或一次。
    '+' 匹配前面的子表達(dá)式一次或多次。
    '*' 匹配前面的子表達(dá)式零次或多次。
    '|' 指明兩項(xiàng)之間的一個(gè)選擇。例子'^([a-z]+|[0-9]+)$'表示所有小寫字母或數(shù)字組合成的
    字符串。
    '( )' 標(biāo)記一個(gè)子表達(dá)式的開始和結(jié)束位置。
    '[]' 標(biāo)記一個(gè)中括號(hào)表達(dá)式。
    '{m,n}' 一個(gè)精確地出現(xiàn)次數(shù)范圍,m=<出現(xiàn)次數(shù)<=n,'{m}'表示出現(xiàn)m次,'{m,}'表示至少
    出現(xiàn)m次。
    \num 匹配 num,其中 num 是一個(gè)正整數(shù)。對(duì)所獲取的匹配的引用。
    字符簇:
    [[:alpha:]] 任何字母。
    [[:digit:]] 任何數(shù)字。
    [[:alnum:]] 任何字母和數(shù)字。
    [[:space:]] 任何白字符。
    [[:upper:]] 任何大寫字母。
    [[:lower:]] 任何小寫字母。
    [[:punct:]] 任何標(biāo)點(diǎn)符號(hào)。
    [[:xdigit:]] 任何16進(jìn)制的數(shù)字,相當(dāng)于[0-9a-fA-F]。
    各種操作符的運(yùn)算優(yōu)先級(jí)
    \轉(zhuǎn)義符
    (), (?:), (?=), [] 圓括號(hào)和方括號(hào)
    *, +, ?, {n}, {n,}, {n,m} 限定符
    ^, $, anymetacharacter 位置和順序
    |
    */
    --創(chuàng)建表
    create table fzq
    (
    id varchar(4),
    value varchar(10)
    );
    --數(shù)據(jù)插入
    insert into fzq values
    ('1','1234560');
    insert into fzq values
    ('2','1234560');
    insert into fzq values
    ('3','1b3b560');
    insert into fzq values
    ('4','abc');
    insert into fzq values
    ('5','abcde');
    insert into fzq values
    ('6','ADREasx');
    insert into fzq values
    ('7','123 45');
    insert into fzq values
    ('8','adc de');
    insert into fzq values
    ('9','adc,.de');
    insert into fzq values
    ('10','1B');
    insert into fzq values
    ('10','abcbvbnb');
    insert into fzq values
    ('11','11114560');
    insert into fzq values
    ('11','11124560');
    --regexp_like
    --查詢value中以1開頭60結(jié)束的記錄并且長(zhǎng)度是7位
    select * from fzq where value like '1____60';
    select * from fzq where regexp_like(value,'1....60');
    --查詢value中以1開頭60結(jié)束的記錄并且長(zhǎng)度是7位并且全部是數(shù)字的記錄。
    --使用like就不是很好實(shí)現(xiàn)了。
    select * from fzq where regexp_like(value,'1[0-9]{4}60');
    -- 也可以這樣實(shí)現(xiàn),使用字符集。
    select * from fzq where regexp_like(value,'1[[:digit:]]{4}60');
    -- 查詢value中不是純數(shù)字的記錄
    select * from fzq where not regexp_like(value,'^[[:digit:]]+$');
    -- 查詢value中不包含任何數(shù)字的記錄。
    select * from fzq where regexp_like(value,'^[^[:digit:]]+$');
    --查詢以12或者1b開頭的記錄.不區(qū)分大小寫。
    select * from fzq where regexp_like(value,'^1[2b]','i');
    --查詢以12或者1b開頭的記錄.區(qū)分大小寫。
    select * from fzq where regexp_like(value,'^1[2B]');
    -- 查詢數(shù)據(jù)中包含空白的記錄。
    select * from fzq where regexp_like(value,'[[:space:]]');
    --查詢所有包含小寫字母或者數(shù)字的記錄。
    select * from fzq where regexp_like(value,'^([a-z]+|[0-9]+)$');
    --查詢?nèi)魏伟瑯?biāo)點(diǎn)符號(hào)的記錄。
    select * from fzq where regexp_like(value,'[[:punct:]]');

    例子:判斷姓名是否為空,少于兩個(gè)字符,包含數(shù)字和字母

    create or replace
    FUNCTION CheckName(NameStr in VARCHAR2) RETURN integer
    As
    BEGIN
    --符合返回1,不符合返回0
       if(NameStr is null or length(NameStr)<2) then
          return 0;
       else
          if(NameStr like '%未取名%') then
           RETURN 0;
           end if;
           if regexp_like(NameStr,'^([a-z]+|[0-9]+|[A-Z]+)$') then
           return 0;
           end if;
           return 1;     
       end if;
    END CheckName;

    posted @ 2012-10-11 17:37 abing 閱讀(273) | 評(píng)論 (0)編輯 收藏

    需求:

    匹配手機(jī)號(hào),第一位可以是+,可以沒有+,后面的全部要是數(shù)字,如:

    +861359415665

    8613659558555

    1356856455

    都是合法的。

    +aa156945555

    aa1359556666

    aaddssdfdfsd

    都是不合法的。

    正則:

    [sql]
    1. SQL> SELECT * FROM DUAL WHERE regexp_like('+333333' ,'^[\+]*[[:digit:]]+');      --該+轉(zhuǎn)義或者不轉(zhuǎn)義,結(jié)果是一樣的   
    2.   
    3. DUMMY  
    4. -----   
    5. X  

    [sql]

    1. SQL> SELECT * FROM DUAL WHERE regexp_like('aa333333' ,'^[+]*[[:digit:]]+');  
    2.   
    3. DUMMY  
    4. -----  

    解釋:

    1.^代表開始,*表示出現(xiàn)0次或多次,+表示出現(xiàn)1次或多次,[:digit:]代表0-9的純數(shù)字(還有$代表以什么結(jié)尾,如果是[[:digit:]]+$代表以數(shù)字結(jié)尾)。該正則的意思就是:

    以+0次或多次開頭,緊接著后面數(shù)字出現(xiàn)一次或多次(即一定要有數(shù)字)。

    2.dual表中,永遠(yuǎn)只有1行記錄。查詢出dual中有記錄,證明where條件成立,反之不成立。

    先前寫了一個(gè)錯(cuò)誤的正則:

    [sql]
    1. [\+]*[[:digit:]]+  

    注意,就只少了一個(gè)代表開始符號(hào)的^。少了這個(gè)符號(hào),說明這個(gè)正則的意思是:

    +出現(xiàn)0次或多次(即+可以出現(xiàn),可以不出現(xiàn)!!),緊后面的數(shù)字出現(xiàn)1次或多次。前面已經(jīng)+可以出現(xiàn)0次了,證明沒有+也可以,那么就是只要字符串中有數(shù)字(+aa111a,aass11111……),這個(gè)正則恒成立,錯(cuò)誤深重啊!!

    Oracle正則表達(dá)式的應(yīng)用by 溫州--名次

    在oracle里正則表達(dá)式有四個(gè)函數(shù)可用,分別是regexp_like、regexp_substr、regexp_instr 和regexp_replace。這里在我們oracle 10g里靈活應(yīng)用。

           先來簡(jiǎn)單介紹一下正則表達(dá)式的內(nèi)容,正則表達(dá)式是做為快速查詢的文本內(nèi)容的,在linux應(yīng)用比較多,首先,行的起始與結(jié)束 “^”這個(gè)字符是表示只查找行首的內(nèi)容。“$”這個(gè)字符只查找行末的內(nèi)容。接下來是“^”還可以做為一個(gè)排除字符來使用。還是使用例子來做一個(gè)演示比較明了一下。

           這里我使用regexp_like這個(gè)函數(shù)來做,這樣可以我們平時(shí)會(huì)使用的比較多。

    select * from test_table

    where regexp_like(field_1,'^1234')

    這個(gè)就是表示是以1234打頭的字符串是不是有匹配的。這里和like的方式是一樣的。

     

     

    select * from test_table

    where regexp_like(field_1,'^[12]234')

    這里多了一個(gè)[]這里做一個(gè)獨(dú)立字符,這里表示是以1或2開始,并且接著是234這個(gè)里的字符就會(huì)是匹配的。

     

     

    select * from test_table

    where regexp_like(field_1,'^(歐陽(yáng)|李)小二')

    這里我們就可以表達(dá),這個(gè)查詢一個(gè)姓是歐陽(yáng)或李的,名字叫小二的字符串。這里多了一個(gè)()這個(gè)是做一個(gè)為字符串的方式來寫的與[]剛好是對(duì)應(yīng)。

    這里還有一個(gè)“|”來表示或的意思。

     

     

    select * from test_table

    where regexp_like(field_1,'^李[小]*二')

    這里我們就可以查詢李小二或是李二,再或者是李小小二,都可以,這里我們需要講一下是[]后面帶了一個(gè)*,這個(gè)是表示0~無窮大 字符去匹配。這個(gè)[]我們還可以添加一個(gè)“+”來表示1~無窮大的字符去匹配,也可以更加精準(zhǔn)一些,在[]后面{1,3}這里就是表示1個(gè)到3個(gè)相同字符的匹配。還有一個(gè)“?”來說表示1或是0個(gè)。

     

     

    select * from test_table

    where regexp_like(field_1,'李[^小]二')

    這里我們可以查詢到姓李的,但是第二字不是“小”這個(gè)字。

     

     

    select * from test_table

    where regexp_like(field_1,'[0-9]')

    這里是表示我們查詢字符串含有0-9的數(shù)字的字符串。

     

     

    select * from test_table

    where regexp_like(field_1,'[a-z]')

    這里是表示我們查詢字符串含有a-z的小寫字母的字符串。

     

     

    select * from test_table

    where regexp_like(field_1,'[A-z]')

    這里是表示我們查詢字符串含有A-z的所有字母的字符串。

     

     

    select * from test_table

    where regexp_like(name,'[[:alpha:]]')

    這里是表示查詢匹配任意字母,也包括中文字

     

     

    select * from test_table

    where regexp_like(name,'[[:alnum:]]')

    這里是表示查詢匹配任意字母和數(shù)字

     

     

    select * from test_table

    where regexp_like(name,'[[:digit:]]')

    這里是表示查詢匹配任意數(shù)字

     

     

    Select * from test_table

    Where regexp_like(name,’of’,’i’)

    這里就是of不區(qū)分大小寫

     

     

    Select * from test_table

    Where regexp_like(name,’^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$’)

    這樣我們可以查詢是不是ip格式

     

     

     

    接下來介紹一下regexp_substr

    這個(gè)也是一個(gè)非常實(shí)用的一個(gè)函數(shù)

     

     REGEXP_SUBSTR與SUBSTR函數(shù)相同,返回截取的子字符串

    REGEXP_SUBSTR(srcstr, pattern [, position [, occurrence [, match_option]]])

    注:

    srcstr 源字符串

    pattern 正則表達(dá)式樣式

    position 開始匹配字符位置

    occurrence 匹配出現(xiàn)次數(shù)

    match_option 匹配選項(xiàng)(區(qū)分大小寫)

     

     

    SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+') FROM dual;

    Output: 1PSN

    [[:alnum:]]+ 表示匹配1個(gè)或者多個(gè)字母或數(shù)字字符

     

     

    SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+', 1, 2) FROM dual;

    Output: 231

    與上面一個(gè)例子相比,多了兩個(gè)參數(shù)

    1 表示從源字符串的第一個(gè)字符開始查找匹配

    2 表示第2次匹配到的字符串(默認(rèn)值是“1”,如上例)

     

     

    select regexp_substr('@@/231_3253/ABc','@*[[:alnum:]]+') from dual;

    Output: 231

    @* 表示匹配0個(gè)或者多個(gè)@

    [[:alnum:]]+ 表示匹配1個(gè)或者多個(gè)字母或數(shù)字字符

    注意:需要區(qū)別“+”和“*”的區(qū)別

     

     

    select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]*') from dual;

    Output: @

    @+ 表示匹配1個(gè)或者多個(gè)@

    [[:alnum:]]* 表示匹配0個(gè)或者多個(gè)字母或數(shù)字字符

     

     

    select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]+') from dual;

    Output: Null

    @+ 表示匹配1個(gè)或者多個(gè)@

    [[:alnum:]]+ 表示匹配1個(gè)或者多個(gè)字母或數(shù)字字符

     

     

    select regexp_substr('@1PSN/231_3253/ABc125','[[:digit:]]+$') from dual;

    Output: 125

    [[:digit:]]+$ 表示匹配1個(gè)或者多個(gè)數(shù)字結(jié)尾的字符

     

     

    select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]+') from dual;

    Output: Null

    @+ 表示匹配1個(gè)或者多個(gè)@

    [[:alnum:]]+ 表示匹配1個(gè)或者多個(gè)字母或數(shù)字字符

     

     

    select regexp_substr('@1PSN/231_3253/ABc125','[[:digit:]]+$') from dual;

    Output: 125

    [[:digit:]]+$ 表示匹配1個(gè)或者多個(gè)數(shù)字結(jié)尾的字符

     

     

    select regexp_substr('@1PSN/231_3253/ABc','[^[:digit:]]+$') from dual;

    Output: /ABc

    [^[:digit:]]+$ 表示匹配1個(gè)或者多個(gè)不是數(shù)字結(jié)尾的字符

     

     

    select regexp_substr('Tom_Kyte@oracle.com','[^@]+') from dual;

    Output: Tom_Kyte

    [^@]+ 表示匹配1個(gè)或者多個(gè)不是“@”的字符

     

     

    select regexp_substr('1PSN/231_3253/ABc','[[:alnum:]]*',1,2)

    from dual;

    Output: Null

    [[:alnum:]]* 表示匹配0個(gè)或者多個(gè)字母或者數(shù)字字符

    注:因?yàn)槭瞧ヅ?個(gè)或者多個(gè),所以這里第2次匹配的是“/”(匹配了0次),而不是“231”,所以結(jié)果是“Null”

     

     

    這里我們有時(shí)候會(huì)查詢字符串里asdfafd<main>dafda 這里我們要取出<main>這個(gè)字符串

    Select regexp_substr('asdfafd<main>dafda','<[^>]+>') from dual

    Output: <main>

    這里我們?cè)?lt;>中間去一個(gè)^>這樣在匹配<之后,在向后查詢的時(shí)候確保在匹配到>之前不再在有>,不然的話就要有可以出錯(cuò)的情況。

     

     

    Select regexp_substr('asdfafd<main>da>fda','<[^<]+>') from dual

    Output: <main>da>

    在這個(gè)例子中,我們?cè)?lt;main>之后還在da>,這樣的話,如果我們沒有添加^>,正則表達(dá)式就會(huì)向后繼續(xù)去匹配,直到最后一個(gè)>為至,這樣就會(huì)出現(xiàn)偏差

     

     

    這個(gè)通常用來實(shí)現(xiàn)字符串的列傳行

    select regexp_substr('123;234;345;456;567;678;789','[^;]+',1,rownum) from dual

    connect by rownum <= length('123;234;345;456;567;678;789') - length(replace('123;234;345;456;567;678;789',';'))+1

    這里length這里操作是先得到有多少個(gè)“;”,再通過 connect by rownum方式來做一行成多行的操作,在變成多行之后,可以通過regexp_substr來取字符串的操作

     

     

    接著上一個(gè)例子

    a,b,c,d,e,d,f,a,n這樣的一個(gè)字符串,我們現(xiàn)在要把字符串里一些重復(fù)去掉,這樣的話結(jié)果是a,b,c,d,e,f,n去掉了d與a的兩個(gè)字符串

    select wm_concat(new_row) from (

    select distinct regexp_substr('a,b,c,d,e,d,f,a,n','[^,]+',1,rownum) new_row from dual

    connect by rownum<=length('a,b,c,d,e,d,f,a,n')-length(replace('a,b,c,d,e,d,f,a,n',',')))

    通過轉(zhuǎn)成多行的,再用distinct 去掉重復(fù),然后我們?cè)偻ㄟ^wm_concat來字符串合并來完成。

     

     

    再來一個(gè)ip格式轉(zhuǎn)換的例子吧,我們一般的IP的格式是12.19.168.27現(xiàn)在要不足3位的補(bǔ)足前面為0,結(jié)果是012.019.168.027

    select wm_concat(new_value) from (

    select

    lpad(regexp_substr('12.19.168.27','[^.]+',1,rownum) ,3,'0') new_value,rownum

    from dual

    connect by rownum<5

    order by rownum)

     

     

    來一個(gè)驗(yàn)證IP是數(shù)字是否正確

    select count(*) from(

    select

    lpad(regexp_substr('12.19.168.27','[^.]+',1,rownum) ,3,'0') new_value,rownum

    from dual

    connect by rownum<5)

    where new_value>=0 and new_value<256

    having count(*) =4

     

     

    來一個(gè)IP字符串格式轉(zhuǎn)換成數(shù)字型IP

    select sum(new_value*power(256,4-rm)) from (

    select regexp_substr('12.19.168.27','[^.]+',1,rownum) new_value,rownum rm from dual

    connect by rownum<=4

    )

     

     

    接下來介紹一個(gè)regexp_instr函數(shù)

     

    REGEXP_INSTR 函數(shù)使用正則表達(dá)式返回搜索模式的起點(diǎn)和終點(diǎn)。REGEXP_INSTR 的語(yǔ)法如下所示。REGEXP_INSTR 返回一個(gè)整數(shù),指出搜索模式的開始或結(jié)束的位置,如果沒有發(fā)現(xiàn)匹配的值,則返回0。

     

    語(yǔ)法:

    2.REGEXP_INSTR與INSTR函數(shù)相同,返回字符串位置

    REGEXP_INSTR(srcstr, pattern [, position [, occurrence [, return_option [,match_option]]]])

    與REGEXP_SUBSTR一樣,它也有變量pattern、position(開始位置)、occurrence 和match_parameter;這里主要介紹一下新參數(shù)return_option 的作用,它允許用戶告訴Oracle,模式出現(xiàn)的時(shí)候,要返回什么內(nèi)容。

     

    Select regexp_instr('asdfafd<main>da>fda','sd') from dual

    Output:2

    這里去查詢sd的位置,這個(gè)和instr是在相同的

     

     

    Select regexp_instr('asdfafd<main>da>fda','da',1,2) from dual

    這里是查詢da第二出現(xiàn)的位置

     

    還有我們經(jīng)常會(huì)遇到一種情況是,查詢某個(gè)字段,如果是等于“上海”或“北京”或者我們溫州就寫成大城市,其它的寫成小城市,我們一般會(huì)考慮使用decode這種方式

     

    Select decode('上海','上海','大城市','北京' ,'大城市' ,'溫州' ,'大城市','小城市') from dual

    只有兩個(gè)我們可能覺的sql也不是很冗長(zhǎng),如果有四五個(gè)的話,就有點(diǎn)長(zhǎng)了,這里使用regexp_instr就可以很多的去操作

     

    Select decode (regexp_instr('北京','^(上海|北京|溫州)'),0,'小城市', '大城市') from dual

    通過regexp_instr不匹配時(shí)為0的條件,這樣就可以完成了

     

     

     

    最后一個(gè)函數(shù)regexp_replace

    REGEXP_REPLACE 函數(shù)是用另外一個(gè)值來替代串中的某個(gè)值。例如,可以用一個(gè)匹配數(shù)字來替代字母的每一次出現(xiàn)。REGEXP_REPLACE的格式如下所示

     

    語(yǔ)法:

    4.REGEXP_REPLACE與REPLACE函數(shù)相同,替換原字符串中的字符內(nèi)容

    REGEXP_REPLACE(srcstr, pattern [,replacestr [, position [, occurrence [,match_option]]]])

     

     

    這個(gè)替換函數(shù)還是一個(gè)非常好用的。

    如我們?cè)谟幸粋€(gè)字符串a(chǎn)dfadfa (main) next 現(xiàn)在我們要把()替換成<>,這里我們可能想用replace就可以搞定了,但是我們現(xiàn)在做的是(之后必須有)這樣的()我們才替換把<>.

    select regexp_replace('adfadfa (main) next ','(\()([^\)]*)(\))','<\2>') from dual

    output: adfadfa <main> next

    這里還是一個(gè)\做為轉(zhuǎn)義字符。

     

    再來一個(gè)ip格式轉(zhuǎn)換的例子吧,我們一般的IP的格式是12.19.168.27現(xiàn)在要不足3位的補(bǔ)足前面為0,結(jié)果是012.019.168.027

    select regexp_replace(

    regexp_replace('12.19.168.27','([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})',

    '00\1.00\2.00\3.00\4') ,

    '([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}$)','\2\4\6\8')

    from dual

    output: 012.019.168.027

    這里我分成兩步來操作,regexp_replace('12.19.168.27','([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})',

    '00\1.00\2.00\3.00\4')我首先讓每個(gè)小字符串做添加0,這樣每個(gè)字符串都會(huì)大于3,再

    '([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}$)','\2\4\6\8')

    這整個(gè)字符串分成8段,這樣我們只要2、4、6、8這四個(gè)段就可以了。

     

     

    下面一個(gè)例子中,在每?jī)蓚€(gè)字符之間插入一個(gè)空格符

    SELECT regexp_replace('YAHOO', '(.)', '\1 ') AS output FROM dual;

    Output: Y A H O O

    這個(gè)用一個(gè)循環(huán)的方式去操作,還蠻好的。

     

     

    select regexp_replace(

    regexp_replace('12.19.168.27','([^.]+)'

    ,'00\1')

    ,'([^.]*)([^.]{3})','\2')

    from dual

    接著剛才那個(gè),我們可以把replace循環(huán)替換的方式來操作。

    posted @ 2012-10-11 17:09 abing 閱讀(380) | 評(píng)論 (0)編輯 收藏

    正則表達(dá)式,給我寫個(gè)1,2,3,4 或者4,1,2,3   匹配出4 來 
    select regexp_substr('1,2,3,4','[4]') tony from dual;
    select regexp_substr('4,3,2,1','[4]') tony from dual;
    oracle  驗(yàn)證電話號(hào)碼(手機(jī)號(hào)碼):

    /**
     * 手機(jī)號(hào)碼
     * 移動(dòng):134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
     * 聯(lián)通:130,131,132,152,155,156,185,186
     * 電信:133,1349,153,180,189
     */
    select t.* from myregex t where regexp_like(t.name,'^1(3[0-9]|5[0-35-9]|8[025-9])[0-9]{8}$')
    select t.* from myregex t where regexp_like(t.name,'^1(3[0-9]|5[0-35-9]|8[025-9])?[0-9]{8}?$')
    select t.* from myregex t where regexp_like(t.name,'^1(3[[:digit:]]|5[0-35-9]|8[025-9])?[[:digit:]]{8}?$')
    /**
     * 中國(guó)移動(dòng):China Mobile
     * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
     */
    select t.* from myregex t where regexp_like(t.name,'^1(34[0-8]?|3[5-9]?|5[017-9]?|8[278]?)[0-9]{8}$')
    select t.* from myregex t where regexp_like(t.name,'^1(34[0-8]?|3[5-9]?|5[017-9]?|8[278]?)[[:digit:]]{8}$')
    /**
     * 中國(guó)聯(lián)通:China Unicom
     * 130,131,132,152,155,156,185,186
     */
    select t.* from myregex t where regexp_like(t.name,'^1(3[0-2]?|5[25-6]?|8[5-6]?)[0-9]{8}$')
    select t.* from myregex t where regexp_like(t.name,'^1(3[0-2]?|5[25-6]?|8[5-6]?)[[:digit:]]{8}$')
    /**
     * 中國(guó)電信:China Telecom
     * 133,1349,153,180,189
     */
    select t.* from myregex t where regexp_like(t.name,'^1((33?|53?|8[09]?)[0-9]?|349)[0-9]{7}$')
    select t.* from myregex t where regexp_like(t.name,'^1((33?|53?|8[09]?)[0-9]?|349)[[:digit:]]{7}$')


    posted @ 2012-10-11 17:03 abing 閱讀(215) | 評(píng)論 (0)編輯 收藏

    NULL指的是空值,或者非法值。
    NVL (expr1, expr2)->expr1為NULL,返回expr2;不為NULL,返回expr1。注意兩者的類型要一致
    NVL2 (expr1, expr2, expr3) ->expr1不為NULL,返回expr2;為NULL,返回expr3。expr2和expr3類型不同的話,expr3會(huì)轉(zhuǎn)換為expr2的類型
    select t.empno,nvl2(t.mgr,'the value is not null','the value is null') from emp t where t.deptno in (select s.deptno from dept s where s.deptno='1')
    NULLIF (expr1, expr2) ->相等返回NULL,不等返回expr1
    select t.empno,nullif(t.mgr,'tom') from emp t where t.deptno in (select s.deptno from dept s where s.deptno='1')
    posted @ 2012-10-11 13:58 abing 閱讀(226) | 評(píng)論 (0)編輯 收藏

    select t.empno,nvl(t.mgr,'MGR') from emp t where t.deptno in (select s.deptno from dept s where s.deptno='1')
    select t.empno,nvl(t.mgr,'MGR') from emp t where exists (select s.deptno from emp s where s.deptno='1' and t.deptno=s.deptno)
    select t.empno,nvl(t.mgr,'MGR') from emp t where t.deptno is not null and exists (select s.deptno from emp s where s.deptno='1' and t.deptno=s.deptno)
    select t.empno,nvl(t.mgr,'MGR') from emp t where not exists (select s.* from dept s where s.deptno  in(2,3) and t.deptno=s.deptno)
    select t.empno,nvl(t.mgr,'MGR') from emp t where t.deptno in (select s.deptno from dept s where s.deptno not in(2,3))































    posted @ 2012-10-11 13:31 abing 閱讀(184) | 評(píng)論 (0)編輯 收藏

    package com.abin.lee.servlet.regex;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    public class RegexTest {
    public static boolean isRight(String validate){
    String regex="/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/";//郵箱正則1
    // String regex="(^[\\w]*@[a-zA-Z]+[.][a-zA-Z]+$)";//郵箱正則1
    // String regex="(^13[0-9]{9}$)|(^15[0-9]{9}$)|(^18[0-9]{9}$)";//電話號(hào)碼正則
    Pattern pattern=Pattern.compile(regex);
    Matcher matcher=pattern.matcher(validate);
    boolean flag=matcher.matches();
    return flag;
    }
    public static void main(String[] args) {
    String validate="varyall@tom.com";
    boolean flag=isRight(validate);
    System.out.println("flag="+flag);
    }
    }
    posted @ 2012-10-10 00:22 abing 閱讀(201) | 評(píng)論 (0)編輯 收藏

    僅列出標(biāo)題
    共7頁(yè): 上一頁(yè) 1 2 3 4 5 6 7 下一頁(yè) 
    主站蜘蛛池模板: 亚洲精品视频专区| 亚洲福利视频一区二区| 亚洲免费闲人蜜桃| 99re在线视频免费观看| 精品视频在线免费观看| 中文字幕在线免费看线人| 成在线人视频免费视频| a色毛片免费视频| a级片免费在线播放| 免费人成在线观看网站| 久久99精品视免费看| 亚洲免费福利视频| 无码日韩人妻av一区免费| 啦啦啦www免费视频| 国产午夜鲁丝片AV无码免费| 免费在线观看日韩| 亚洲日本一区二区一本一道| 国产AV无码专区亚洲AV漫画 | 99免费在线观看视频| 久久永久免费人妻精品下载| 最近最好最新2019中文字幕免费 | 国产精品亚洲综合天堂夜夜| 精品特级一级毛片免费观看| 曰韩无码AV片免费播放不卡| 国产成人无码区免费内射一片色欲 | 亚洲成在人线av| 亚洲精品免费观看| 亚洲国产视频久久| 老妇激情毛片免费| 国产免费一区二区三区不卡| 黄在线观看www免费看| 男女啪啪永久免费观看网站| 亚洲欧洲一区二区三区| 亚洲AV无码成人精品区蜜桃| 亚洲五月丁香综合视频| 色噜噜噜噜亚洲第一| a级片免费在线播放| 2021免费日韩视频网| 免费在线视频一区| 亚洲日本一区二区三区| 亚洲精华国产精华精华液网站|