2011-01-04 1 views
2

テキスト文字列から数値を抽出し、別のテーブルに結合しようとしています。ここで私がこれまで持っているものです。結合で使用するテキスト文字列をデコードする

SELECT sect.id, 
     sect.section_number, 
     sect.expression, 
     p.abbreviation 
    FROM sections sect 
    JOIN period p ON SUBSTR(sect.expression, 1, (INSTR(sect.expression,'(')-1)) = p.period_number 
       AND p.schoolid = 73253 
       AND p.year_id = 20 
    JOIN courses c ON sect.course_number = c.course_number 
WHERE sect.schoolid = 73253 
    AND sect.termid >= 2000 

私はいくつかの他のスレッドを読んで(常に左括弧の前に来る)番号を取り除く方法を考え出しました。問題は

9(A) - check 
10(A) - check 

なく

5-6(A) 

5-6(A)、カラム・sect.expressionに住んでデータの3つのスタイルの2のために、このアカウントのみがキックバックだろうということですOracle 01722無効な番号のエラーです。 substr ...行を変更する方法はありますか?5-6(A)データ型の場合、最初の数値(5)を取得してそれに参加するようにしますか?

私はこのテーブルの読み取り権しか持っていないので、何らかのヘルパーテーブル/カラムの作成に依存するソリューションは動作しません。

ありがとうございます!

+1

これはあまりにも読み込みに問題があります。対応する「period_number」列をテーブル期間と同じデータタイプを使用します。オプティマイザは、SUBSTR(col、x、x)で収集した統計を効率的に使用して結合選択性を計算することはできません。これは、誤った計算の結果、実行計画が異なる場合にのみ問題になります。 – Ronnis

答えて

2

は、あなたが使用することができますREGEXP_REPLACE

1):あなたがより複雑な正規表現が必要な場合は、私がこのサイトをお勧めします文字列の先頭に数字を入れて、後で表示される数字は無視してください。

JOIN period p ON REGEXP_REPLACE(sect.expression, '^(\d+)(.*)', '\1') 
+0

5-6例? –

+0

それはyeild 56です。開始桁を抽出するように投稿を更新しました – Chandu

+0

変更は5-6(A)の例を含む3つのデータタイプすべてを完全に処理します。 – Andrew

2

ではなくOracle 10g, you could use a regexビーイング:

JOIN period p ON REGEXP_SUBSTR(sect.expression, '^\d+', 1, 1) = p.period_number 

確かに、私はニーズが動作して正規表現 - それは、文字列の先頭に最初の番号を取得します。

JOIN period p ON REGEXP_REPLACE(sect.expression, '[^0-9]', '') = p.period_number 

2)あなたが一致させたい場合は:あなたは数字のみを抽出したい場合はhttp://www.regular-expressions.info/tutorial.html

+0

ありがとう! 10(A)の場合は1または10を返しますか?それは説明される必要があるもう一つの主要なケースです。** ** '('または ' - ' – Andrew

+0

@Andrew: '\ d +'は任意の長さの数値と一致します。 '^'は文字列が数値で始まることを保証します。最後の文の読み方と同様に、正規表現を使用するかどうかを調べる必要があります。 –

関連する問題