2009-02-27 8 views
2

2つの列(ID(INT)、DATA(VARCHAR(100))を持つテーブル "A"があるとします。SQL結果から数値データを抽出する方法

DATA 
--------------------- 
Nowshak 7,485 m 
Maja e Korabit (Golem Korab) 2,764 m 
Tahat 3,003 m 
Morro de Moco 2,620 m 
Cerro Aconcagua 6,960 m (located in the northwestern corner of the province of Mendoza) 
Mount Kosciuszko 2,229 m 
Grossglockner 3,798 m 
// the DATA continues... 
--------------------- 

私はSELECT SQLクエリで文字列処理機能のいくつかの種類を使用して数値データのみを抽出することができますどのように変更されたSELECTからの結果となるよう:表の結果のように見える「からデータを選択」実行

DATA (in INTEGER - not varchar) 
--------------------- 
7485 
2764 
3003 
2620 
6960 
2229 
3798 
// the DATA in INTEGER continues... 
--------------------- 

ところで、これを1つのSQL文で実行することができればよいでしょう。 PostgreSQL

SELECT TO_NUMBER(REGEXP_REPLACE(data, '[^0-9]', '')) 
FROM a 

感謝:) Oracle

+0

あなたはどのプラットフォームを使用していますか? – Quassnoi

+0

IBM DB2バージョン9.5(XMLストレージをネイティブにサポートする新しいバージョン) – natch3z

答えて

2

(私はIBMのDB2バージョン9.5を使用しています)

SELECT CAST(REGEXP_REPLACE(data, '[^0-9]', '', 'g') AS INTEGER) 
FROM a 
MS SQL Server

DB2を、あなたがする必要があります正規表現とこのようなクエリのためにUDFを作成してください。

詳細については、リンクを参照してください。

+0

申し訳ありません。私はDB2バージョン9.5を使用していることを忘れていました。 – natch3z

+0

は、SQLで正規表現を使用できることを知りませんでした+1 –

+0

MSSQL Server用に1つ投稿できますか? –

2

DB2用のクイック検索を実行すると、見つけられる最高の組み込み関数Translateは、他の文字に変更したい文字のリストを指定することができます。それは理想的ではありませんが、ストリップしたいすべての文字、つまり、数字以外の文字をすべて指定できます。

(これは長いリストです。 '?。>/\ <、ABC ... XYZ | [など]' それは

、 'データ'(TRANSLATE)理想的ではないのです、 '「)

また、あなたが定義したユーザーを作成する必要があります番号を検索する機能。それにはいくつかの選択肢があります。

  1. 各文字を1つ1つ確認し、数字の場合にのみ保持してください。

  2. あなたが数とどのような数を、次のの前に知っている場合は、あなたがそれらを検索し、民主党員のsuggestonに私がきたアプローチを詳述すると

  3. ...間
-1

にあるものを維持することができます使用されるスカラーユーザー定義関数(UDF)は、英数字の文字列を受け取り、その文字列(反復ごとに1バイト)を反復して反復し、出力から数値以外の文字を抑制します。再帰式は反復ごとに行を生成しますが、最終行のみが保持され、呼び出し元のアプリケーションに戻されます。

+0

これはひどく遅いです。 – Hogan

4

私はこのスレッドは古いと知っている、OPは答えが必要ないが、私はこれと他のスレッドからいくつかのヒントでこれを把握しなければならなかった。彼らはすべて正確な答えを見逃しているようです。

これを行う簡単な方法は、TRANSLATEすべての不要な文字を1文字にしてから、REPLACEその文字を空の文字列にすることです。

DATA = 'Nowshak 7,485 m' 

# removes all characters, leaving only numbers 
REPLACE(TRANSLATE(TRIM(DATA), '_____________________________________________________________________________________________', ' abcdefghijklmnopqrstuvwzyaABCDEFGHIJKLMNOPQRSTUVWXYZ`[email protected]#$%^&*()-_=+\|[]{};:",.<>/?'), '_', '') 
=> '7485' 

TRANSLATEコマンド打破するには、次の

TRANSLATE(FIELD or String, <to characters>, <from characters>) 

例えばを

DATA = 'Sample by John' 

TRANSLATE(DATA, 'XYZ', 'abc') 
=> a becomes X, b becomes Y, c becomes Z 
=> 'SXmple Yy John' 

**注:パフォーマンスやバージョンの互換性については言及できません。私はDB2の9.xバージョンを使用しています。これが誰かを助けることを望みます。

+0

ここで 'REPLACE'は必要ありません。最初のパラメータが' '''ならば、それらの文字はすべて削除されます。 'UPPER'関数を使うこともできますので、小文字をリストする必要はありません。 – Hogan

+0

@Hogan、 'TRANSLATE()'は3番目のパラメータと同じ数の文字を2番目のパラメータに必要とするため、REPLACEが必要です(少なくとも9.xバージョンのDB2では)。また、 'UPPER()'を使用するとtranslateコマンドが簡素化されますが、全体的に効率的かどうかはわかりません。 –

+0

最後の例を参照して、 'u'を削除します。http://www.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000862。 html 9.7より前のバージョンを使用していますか? :) 'TRANSLATE(x、 '1234567890'、 '1234567890 ....')'はうまく動作します。 – Hogan

関連する問題