2017-08-18 5 views
-4

テーブルの列に文字列データがあり、そこに金額が含まれています。Oracle SQLの文字列内のテキストを返す

E.G.コラムのようなもの含まれていてもよい:「デイブは一度宝くじシンジケートに£50.00を支払った」 を を私は「£」の発生を検索することができますどのように

「総投資額は2017年にファンドのために返し£150,964.39に来ました」その後に発生する番号を返します。

ありがとうございました

+0

各行に最大1つのポンド記号があることを事前に知っていますか?ポンド記号がまったくない場合、結果には何も含まれません - 出力には何も含まれていないか、またはNULLが含まれていますか? 2つ以上のポンド記号がある場合、望ましい結果は何ですか?そして、テキストが次のようなものならどうなりますか: "ポンドの通貨記号は£文字です。" – mathguy

+0

このような正規表現の質問がたくさんあります。本当に、 '£([0-9] [0-9。、] *)のような正規表現を書くのはロケット科学ではありません。 –

+0

@ MarcusESP79のスタックオーバーフローへようこそ。SQLでは文字列を検索する方法はたくさんあります。次の内容を確認してください:https://stackoverflow.com/help/how-to-askおそらく、以前の質問と回答を簡単に検索すると、トピックの理解が深まるでしょう。その情報を武器に、あなたが試みたこととあなたの望む結果を達成できないことを含む質問を編集することができます。 – Degan

答えて

1

これは片道です。検索式は、1,000個の区切りと小数点(すべてオプション)を許可する必要があるため、少し複雑です。それは何千ものセパレータの "西洋的"使用を前提としています。例えば、Lakh(Indian)表記を可能にするために少し修正する必要があります。ポンド記号がない場合、または直後にポンド記号が1つ以上ない場合は、NULLが生成されます。 (したがって、£0.60の代わりに£.60のようなものを許可すると少し修正する必要があります)。もし望むなら、金額だけをキャプチャすることもできます。これはREGEXP_SUBSTRのわずかな変更ですグループ)。

入力行ごとに複数の金額がある場合は、最も大きな変更が必要になります。

with 
    inputs (str) as (
     select 'Dave once paid £50.00 to a lottery syndicate.' from dual union all 
     select 'Total Returns in 2017 came to £150,964.39.' from dual 
    ) 
-- End of simulated inputs (for testing purposes only, not part of the solution). 
-- Use your actual table and column names in the SQL query below. 
select str, regexp_substr(str, '£\d{1,3}(,?\d{3})*(\.\d+)?') as amount 
from inputs 
; 

STR           AMOUNT 
--------------------------------------------- ----------- 
Dave once paid £50.00 to a lottery syndicate. £50.00 
Total Returns in 2017 came to £150,964.39.  £150,964.39 

編集

以下のコメントで、OPは、通貨記号なしで、単に量を取得する方法を尋ねました。最も簡単な方法は、REGEXP_SUBSTR()関数でキャプチャグループを直接使用することです。以下のバージョンでは、関数の6つの引数をすべて使用しています。前者は入力文字列、2番目は検索パターンです。 3番目と4番目は開始位置と発生です(この問題では常にどちらも1に等しい)。 5番目のNULLは、私たちが必要としない特別なオプションです。 6番目の引数は関連しています:1は、最初のキャプチャグループ、つまり一致するカッコの最初のペアに含まれる検索パターンの部分を返します(左から右に数えます)。シャープ記号の量を単離するために、検索パターンの括弧の追加のペアに注目してください。NUMBERデータ型で量を抽出する

regexp_substr(str, '£(\d{1,3}(,?\d{3})*(\.\d+)?)', 1, 1, null, 1) 

編集#2

、それはする必要がありませんポンド記号を取り除く。 TO_NUMBER()関数がそれを処理できます。代わりに、量が続くだけでポンド記号であるサブストリングが適切な形式のモデルと明示的な通貨記号を使用して、TO_NUMBER()内にラップする必要があります。

to_number(regexp_substr(str, '£\d{1,3}(,?\d{3})*(\.\d+)?'), 
       'L999,999,999,999,999.000000', 'nls_currency=£') 

ただ、小数点の右側に十分な数字が含まれていることを確認してくださいすべての可能な金額に対応してください。 (フォーマットモデルの数字が多すぎると問題になることはありません)

+0

これはすばらしいことです データは私の例よりもはるかに具体的ですが、ビジネス情報であるため抽出できません。 今後の質問で少しは簡潔にしようとしますが、このフォーラムはOracle SQLと同じように私には新しくありません。 助けてくれてありがとう! – MarcusESP79

+0

@ MarcusESP79 - OK、あなたの実際のデータに適応しようとします。あなたが困難に遭遇した場合は、ここに戻って躊躇しないでください。具体的な質問は最高です: "私はこの文字列を持っています、....、私は抽出する必要があります....希望の結果です.....私はこのクエリを試した:...ほとんどの場合、しかし、この例では難易度は..... "このように質問すると、ちょうど適切に尋ねられたために、バットからすぐにいくつかのアップフォースを得ることができます(残念なことに、ほとんどの質問はそうではありません...) – mathguy

+0

ありがとう。 ここでの難しさは実際にどこから始めるべきかを知っています。多くの検索にもかかわらず、私はregexp_substrが何であるか分かりませんでした.... 実際には£記号を除外するように選択項目を変更するのは簡単ですか? いくつかのlen()関数を操作する方法はわかっていますが、より洗練された方法が必要ですか? – MarcusESP79

関連する問題