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

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

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

    紙飛機

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

    問題:對于字母數(shù)字的數(shù)據(jù),只返回數(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

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

    討論

    兩種解決方案的唯一差別是語法,DB2使用函數(shù)REPEAT代替RPAD,而且TRANSLATE參數(shù)列表的順序也不同。以下的解釋采用了Oracle/PostgreSQL解決方案, DB2也類似。如果從里向外運行該查詢(僅僅從TRANSLATE開始),就會發(fā)現(xià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ù)值。這個特殊的例子尤其簡單,因為字符串中只有字母和數(shù)字。如果還有其他字符,那么用另一種方法會更容易:不是找出非數(shù)字字符并去掉它們,而是找出所有數(shù)字字符,并去掉不屬于這些字符范圍的其他字符。下面的例子會有助于理解這種技巧:

    select replace(

          translate('paul123f321',

            replace(translate( 'paul123f321',

                               '0123456789',

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

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

       from t1

    NUM

    ------

    123321

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

    select translate( 'paul123f321',

                       '0123456789',

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

       from t1

    TRANSLATE('

    -----------

    paul###f###

    與原來方案不同的是,它沒有用“#”字符替換每個非數(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

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

    posted on 2008-05-14 21:50 紙飛機 閱讀(4721) 評論(0)  編輯  收藏 所屬分類: Database
    主站蜘蛛池模板: 亚洲人成网站18禁止久久影院 | 免费看污成人午夜网站| 亚洲动漫精品无码av天堂| 美女被羞羞网站免费下载| 日本免费人成黄页在线观看视频| 亚洲国产系列一区二区三区| 噼里啪啦免费观看高清动漫4| 亚洲人成伊人成综合网久久| 日本一卡精品视频免费| 亚洲综合视频在线| 在线看片韩国免费人成视频| 97se亚洲国产综合自在线| 成人免费777777| 性色av极品无码专区亚洲 | 中文字幕免费不卡二区| 日韩亚洲一区二区三区| 91热久久免费精品99| 亚洲人成综合网站7777香蕉| 在线视频免费观看www动漫| 国产成人综合亚洲绿色| 国产成人亚洲综合| 免费在线中文日本| 亚洲乱码一二三四五六区| 成人永久免费高清| 两性色午夜视频免费网| 亚洲日韩乱码中文无码蜜桃| 午夜时刻免费入口| 国产亚洲精品免费视频播放| 久久亚洲春色中文字幕久久久| 亚洲精品动漫免费二区| 激情吃奶吻胸免费视频xxxx| 亚洲人成色777777在线观看| 天天影院成人免费观看| 国产成人亚洲精品电影| 亚洲阿v天堂在线| 女性无套免费网站在线看| fc2成年免费共享视频18| 亚洲日本在线播放| 亚洲色欲久久久久综合网| 2015日韩永久免费视频播放 | 一级毛片a免费播放王色电影|