列値の特定の部分を抽出したいとします。処方箋テキストの構造から変化するので ターゲット列とその値がOracle SQLでの列値の特定の部分の抽出
TEMP_COL
---------------
DESCOL 10MG
TEGRAL 200MG 50S
COLOSPAS 135MG 30S
ように見える結果の列が
RESULT_COL
---------------
10MG
200MG
135MG
列値の特定の部分を抽出したいとします。処方箋テキストの構造から変化するので ターゲット列とその値がOracle SQLでの列値の特定の部分の抽出
TEMP_COL
---------------
DESCOL 10MG
TEGRAL 200MG 50S
COLOSPAS 135MG 30S
ように見える結果の列が
RESULT_COL
---------------
10MG
200MG
135MG
を行うことができます。
これはまた、中期的な用語が測定単位としてミリグラムを使用していることを前提としています。 –
のようになります。私はおそらくREGEXP_SUBSTR()
ではなく、基本機能を使用して、この近づくだろうレコードを記録する。
SELECT TRIM(REGEXP_SUBSTR(TEMP_COL, '(\s)(\S*)', 1, 1))
FROM yourTable
(\s)(\S*)
パターンは、非空白文字の任意の数続く単一スペースと一致します。これはすべての場合において第2項と一致しなければならない。 TRIM()
を使用して、一致して返される先頭のスペースを削除します。
抽出する部分はどのように分かりますか?どこから始まり、どこで終わるのか、どうやって知っていますか?空白を使用していますか?
もしそうなら、データをカットするために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;
注これは大文字と小文字が区別され、それは常に最初試合を返すこと;そのことについて申し訳ありません。)これは、正規表現を使用して
あなたの 'REGEXP_SUBSTR()'に問題があります。あなたはそれが何かを見ますか? –
@TimBiegeleisen、yup。一定。 –
要件についてより明確にする必要があります。ルール/アルゴリズムとは何ですか?例えば、それは1であってもよい。 2.数字で始まる最初の単語。 3.サフィックスとしてMGを使用している作業... etc – BobC
質問時にアルゴリズムを考えなかった。しかし、必要なデータは、列の値を逆にして抽出し、スペースが発生するまで「MG%」のように見つけることができます。私はアルゴリズムを実際のSQL形式にする方法を理解できませんでした。 – AghaKhan
いつもあなたが抽出したいMGの後に数字がありますか? –