Decode360's Blog

          業(yè)精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
            302 隨筆 :: 26 文章 :: 82 評(píng)論 :: 0 Trackbacks
          ??? 在ITPUB上看到個(gè)帖子,計(jì)算四則運(yùn)算的,順便來(lái)學(xué)習(xí)一下10g里的正則表達(dá)式:
          ?
          ??? 原帖地址:http://www.itpub.net/viewthread.php?tid=1051167&extra=page%3D1%26amp%3Bfilter%3Ddigest
          ?
          ??? 把樓主計(jì)算四則運(yùn)算的SQL貼一下,加了一些我自己的注釋:
          ?

          select a.id,

          ?????? max (text) text,

          ?????? sum (regexp_substr(add_text, '[0-9]+' , 1 ,n) -- 依次找出第 N 個(gè)數(shù)字

          ?????????? *

          ?????????? decode(regexp_substr( '+' ||add_text, '[^0-9]' , 1 ,n), '+' , 1 ,- 1 )) -- 依次找出 +|- ,然后在后面的數(shù)字上乘以系數(shù)

          ?????? -- 以上 sum 計(jì)算了所有 +|- 運(yùn)算的總合計(jì)值

          ?????? +

          ?????? nvl( sum (( select decode(substr(regexp_substr( '+' ||text, '[+|-]([0-9]+[*|/]+)+[0-9]+' , 1 ,n), 1 , 1 ), '+' , 1 ,- 1 )

          ???????????????????????????????????? -- 找出 +|- 開(kāi)頭,并緊跟數(shù)字、 [*|/] 、數(shù)字的部分,依次根據(jù)第一位來(lái)判定系數(shù)

          ?????? *

          ?????? power( 10 , Sum ( Log ( 10 ,decode(regexp_substr( '*' ||regexp_substr(text, '([0-9]+[*|/]+)+[0-9]+' , 1 ,n), '[^0-9]' , 1 , rownum ),

          ???????????????????????????????????????????????????? -- 找出第 n 個(gè)數(shù)字、 [*|/] 、數(shù)字相連的部分

          ????????????????????????????????? -- 排除數(shù)字,找出前面找到的部分中的第 rownum 個(gè)非數(shù)字的字符 ( 最前面加 *)

          ????????????????????????? ???????? '*' ,

          ????????????????????????????????? regexp_substr(regexp_substr(text, '([0-9]+[*|/]+)+[0-9]+' , 1 ,n), '[0-9]+' , 1 , rownum ),

          ????????????????????????????????? -- 如果是 '*' 則,則直接找到 * 后面的數(shù)字部分

          ????????????????????????????????? 1 /regexp_substr(regexp_substr(text, '([0-9]+[*|/]+)+[0-9]+' , 1 ,n), '[0-9]+' , 1 , rownum )

          ????????????????????????????????? -- 如果不是 '*'( /) ,則用 1/NUM

          ????????????????????????????????? ))))

          ?????? -- 外層通關(guān) LOG POWER 函數(shù),把乘除法轉(zhuǎn)換為加減法

          ?????? from dual connect by rownum <=len) -- 在這里再做一層循環(huán),用于計(jì)算乘除法

          ?????? ) , 0 ) wanted

          ? from ?

          ?????? ( select a.id,

          ?????????????? a.text,

          ?????????????? length(regexp_replace(text, '[0-9]+' ))+ 1 len, -- 去掉數(shù)字計(jì)算運(yùn)算符個(gè)數(shù)

          ?????????????? regexp_replace(text, '([0-9]+[*|/]+)+[0-9]+' , 0 ) add_text -- *|/ 操作的數(shù)均用 0 代替

          ????????? from t_mar a) a,

          ?????? ( select rownum n from dual connect by rownum < 100 ) b

          ? where a.len>=b.n -- 可以直接形成從 1 a.len 的循環(huán)操作

          ? group by id

          ? order by id ;

          ?

          ?
          ??? 除了一些轉(zhuǎn)化、分類的思想之外,主要就是用到了正則表達(dá)式,再把Oracle 10g中的正則表達(dá)式規(guī)則也貼一下:
          ?

          \ ???? The backslash character can have four different meanings depending on

          ????? the context. It can:

          ?????? Stand for itself

          ?????? Quote the next character

          ?????? Introduce an operator

          ?????? Do nothing

          * ???? Matches zero or more occurrences

          + ???? Matches one or more occurrences

          ? ???? Matches zero or one occurrence

          | ???? Alternation operator for specifying alternative matches

          ^ ???? Matches the beginning of a string by default. In multiline mode, it matches

          ????? the beginning of any line anywhere within the source string.

          $ ???? Matches the end of a string by default. In multiline mode, it matches the

          ?? ???end of any line anywhere within the source string.

          . ???? Matches any character in the supported character set except NULL

          [ ] ?? Bracket expression for specifying a matching list that should match any

          ????? one of the expressions represented in the list. A nonmatching list

          ????? expression begins with a circumflex (^) and specifies a list that matches

          ????? any character except for the expressions represented in the list.

          ( ) ?? Grouping expression, treated as a single subexpression

          {m} ?? Matches exactly m times

          {m,} ? Matches at least m times

          {m,n} Matches at least m times but no more than n times

          \n ??? The backreference expression (n is a digit between 1 and 9) matches the nth

          ????? subexpression enclosed between '(' and ')' preceding the \n

          [..] ? Specifies one collation element, and can be a multicharacter element (for

          ????? example, [.ch.] in Spanish)

          [: :] Specifies character classes (for example, [:alpha:]). It matches any character

          ????? within the character class.

          [==] ? Specifies equivalence classes. For example, [=a=] matches all characters

          ????? having base letter 'a'.

          ?
          ?
          ??? 這樣就比較完整了,至于regexp_substrregexp_replace主要查詢《SQL Reference》就可以了
          ?
          ?




          -The End-

          posted on 2008-12-29 21:17 decode360-3 閱讀(175) 評(píng)論(0)  編輯  收藏 所屬分類: SQL Dev
          主站蜘蛛池模板: 虎林市| 老河口市| 云霄县| 东光县| 虹口区| 封丘县| 南部县| 吉水县| 舒城县| 西丰县| 潼南县| 灵山县| 阿拉善盟| 井陉县| 罗山县| 巫山县| 图木舒克市| 安丘市| 玉树县| 尉氏县| 永兴县| 富民县| 密云县| 揭东县| 兴仁县| 哈巴河县| 明溪县| 黑河市| 仙游县| 昆山市| 大连市| 陵川县| 汾西县| 哈尔滨市| 祥云县| 即墨市| 盘锦市| 邻水| 安图县| 黄骅市| 南通市|