2017-03-08 13 views
0

列値の特定の部分を抽出したいとします。処方箋テキストの構造から変化するので ターゲット列とその値がOracle SQLでの列値の特定の部分の抽出

TEMP_COL 
--------------- 
DESCOL 10MG 
TEGRAL 200MG 50S 
COLOSPAS 135MG 30S 

ように見える結果の列が

RESULT_COL 
--------------- 
10MG 
200MG 
135MG 
+0

要件についてより明確にする必要があります。ルール/アルゴリズムとは何ですか?例えば、それは1であってもよい。 2.数字で始まる最初の単語。 3.サフィックスとしてMGを使用している作業... etc – BobC

+0

質問時にアルゴリズムを考えなかった。しかし、必要なデータは、列の値を逆にして抽出し、スペースが発生するまで「MG%」のように見つけることができます。私はアルゴリズムを実際のSQL形式にする方法を理解できませんでした。 – AghaKhan

+0

いつもあなたが抽出したいMGの後に数字がありますか? –

答えて

1

を行うことができます。

+0

これはまた、中期的な用語が測定単位としてミリグラムを使用していることを前提としています。 –

2

のようになります。私はおそらくREGEXP_SUBSTR()ではなく、基本機能を使用して、この近づくだろうレコードを記録する。

SELECT TRIM(REGEXP_SUBSTR(TEMP_COL, '(\s)(\S*)', 1, 1)) 
FROM yourTable 
(\s)(\S*)

パターンは、非空白文字の任意の数続く単一スペースと一致します。これはすべての場合において第2項と一致しなければならない。 TRIM()を使用して、一致して返される先頭のスペースを削除します。

0

抽出する部分はどのように分かりますか?どこから始まり、どこで終わるのか、どうやって知っていますか?空白を使用していますか?

もしそうなら、データをカットするためにsubstrを使用し、空白を見つけるためにinstrを使用することができます。

例:

select substr(tempcol, -- string 
       instr(tempcol, ' ', 1), -- location of first white-space 
       instr(tempcol, ' ', 1, 2) - instr(tempcol, ' ', 1)) -- length until next space 
from dual 

別の解決策は、regexp_substrを使用している(ただし、行の多くを持っている場合には、パフォーマンス上の困難かもしれません):

SELECT REGEXP_SUBSTR (tempcol, '(\S*)(\s*)', 1, 2) 
FROM dual; 

編集:含まれるように正規表現を修正しました解析されたテキストの後にスペースを持たない式。

SELECT regexp_substr(TEMP_COL, '[0-9]+MG') 
FROM the_table; 

注これは大文字と小文字が区別され、それは常に最初試合を返すこと;そのことについて申し訳ありません。)これは、正規表現を使用して

+0

あなたの 'REGEXP_SUBSTR()'に問題があります。あなたはそれが何かを見ますか? –

+0

@TimBiegeleisen、yup。一定。 –

関連する問題