紙飛機(jī)

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            22 隨筆 :: 28 文章 :: 30 評(píng)論 :: 0 Trackbacks

          問題:對(duì)于字母數(shù)字的數(shù)據(jù),只返回?cái)?shù)字值。從字符串“paul123f321”中返回123321。

          解決方案

          DB2

          使用函數(shù)TRANSLATE和REPLACE,從字母數(shù)字串中提取數(shù)字字符:

          1 select cast(

          2         replace(

          3       translate( 'paul123f321',

          4                  repeat('#',26),

          5                  'abcdefghijklmnopqrstuvwxyz'),'#','')

          6         as integer ) as num

          7    from t1

          Oracle和PostgreSQL

          使用函數(shù)TRANSLATE和REPLACE,可以從包含字母數(shù)字的字符串中提取數(shù)字字符:

          1 select cast(

          2         replace(

          3       translate( 'paul123f321',

          4                  'abcdefghijklmnopqrstuvwxyz',

          5                  rpad('#',26,'#')),'#','')

          6         as integer ) as num

          7   from t1    

          MySQL和SQL Server

          到本書編寫時(shí)為止,這兩個(gè)供應(yīng)商都不支持TRANSLATE函數(shù),因此這里不能給出解決方案了。

          討論

          兩種解決方案的唯一差別是語法,DB2使用函數(shù)REPEAT代替RPAD,而且TRANSLATE參數(shù)列表的順序也不同。以下的解釋采用了Oracle/PostgreSQL解決方案, DB2也類似。如果從里向外運(yùn)行該查詢(僅僅從TRANSLATE開始),就會(huì)發(fā)現(xiàn)這非常簡(jiǎn)單。首先,TRANSLATE把非數(shù)字字符轉(zhuǎn)換為“#”:

          select translate( 'paul123f321',

                             'abcdefghijklmnopqrstuvwxyz',

                             rpad('#',26,'#')) as num

             from t1

          NUM

          -----------

          ####123#321

          由于現(xiàn)在所有非數(shù)字字符都用“#”表示了,因此只需使用REPLACE去掉它們,然后把結(jié)果轉(zhuǎn)換為數(shù)值。這個(gè)特殊的例子尤其簡(jiǎn)單,因?yàn)樽址兄挥凶帜负蛿?shù)字。如果還有其他字符,那么用另一種方法會(huì)更容易:不是找出非數(shù)字字符并去掉它們,而是找出所有數(shù)字字符,并去掉不屬于這些字符范圍的其他字符。下面的例子會(huì)有助于理解這種技巧:

          select replace(

                translate('paul123f321',

                  replace(translate( 'paul123f321',

                                     '0123456789',

                                     rpad('#',10,'#')),'#',''),

                          rpad('#',length('paul123f321'),'#')),'#','') as num

             from t1

          NUM

          ------

          123321

          較之原始方案,該解決方案看起來有點(diǎn)兒費(fèi)解,但如果把它分解開來就容易理解了。觀察一下最內(nèi)層的TRANSLATE調(diào)用:

          select translate( 'paul123f321',

                             '0123456789',

                             rpad('#',10,'#'))

             from t1

          TRANSLATE('

          -----------

          paul###f###

          與原來方案不同的是,它沒有用“#”字符替換每個(gè)非數(shù)字字符,而是用“#”字符替換所有數(shù)字字符。接下來,去掉所有“#”,這樣,只剩下非數(shù)字字符:

          select replace(translate( 'paul123f321',

                                     '0123456789',

                                     rpad('#',10,'#')),'#','')

             from t1

          REPLA

          -----

          paulf

          下一步,再次調(diào)用TRANSLATE,這次用“#”字符替換原始字符串中的所有非數(shù)字字符(前面查詢的結(jié)果):

          select translate('paul123f321',

                  replace(translate( 'paul123f321',

                                     '0123456789',

                                     rpad('#',10,'#')),'#',''),

                          rpad('#',length('paul123f321'),'#'))

             from t1

          TRANSLATE('

          -----------

          ####123#321

          到這里停一停,檢驗(yàn)一下最外層的TRANSLATE調(diào)用。RPAD的第二個(gè)參數(shù)(DB2中REPEAT的第二個(gè)參數(shù))是原始字符串的長(zhǎng)度。這樣做很方便,因?yàn)槭菦]有任何字符出現(xiàn)的次數(shù)會(huì)比它所在的整個(gè)字符串長(zhǎng)?,F(xiàn)在,用“#”字符替換所有非數(shù)字字符;最后一步,使用REPLACE去掉所有“#”。至此,僅剩下數(shù)字。

          posted on 2008-05-14 21:50 紙飛機(jī) 閱讀(4718) 評(píng)論(0)  編輯  收藏 所屬分類: Database
          主站蜘蛛池模板: 山丹县| 犍为县| 曲沃县| 汉川市| 东兴市| 凤凰县| 宜丰县| 金昌市| 杭州市| 琼海市| 乌鲁木齐市| 环江| 新绛县| 鄄城县| 文山县| 华阴市| 宜兴市| 滁州市| 齐齐哈尔市| 鄄城县| 杭州市| 河北区| 泸水县| 卫辉市| 巨野县| 东丽区| 大姚县| 安丘市| 托克逊县| 宜宾市| 盐城市| 吉木萨尔县| 嘉禾县| 潼关县| 徐汇区| 吉水县| 米泉市| 湖州市| 许昌市| 榕江县| 宁河县|