web-dev-qa-db-ja.com

Oracle関数を使用して文字列から数値を抽出する

パラメーターとして文字列を受け取るOracle DB関数を作成する必要があります。文字列には文字と数字が含まれます。この文字列からすべての数値を抽出する必要があります。たとえば、RO1234のような文字列がある場合、extract_number('RO1234')などの関数を使用できる必要があり、結果は1234になります。 。

さらに正確に言うと、これはこの関数が使用されるSQLクエリの一種です。

SELECT DISTINCT column_name, extract_number(column_name) 
FROM table_name
WHERE extract_number(column_name) = 1234;

質問:Oracle SQL DeveloperまたはSQLToolsクライアントアプリケーションのいずれかを使用して、上記の例のように使用できるように、Oracleデータベースにそのような関数を追加するにはどうすればよいですか?

7
Vali S

文字列からすべての非数字文字を削除するには、REGEXP_REPLACEを使用します。

select regexp_replace(column_name, '[^0-9]', '')
from mytable;

または

select regexp_replace(column_name, '[^[:digit:]]', '')
from mytable;

もちろん、関数extract_numberを書くことができます。ただし、1つの関数呼び出しのみで構成される関数を記述するのは、ちょっとやり過ぎのように思えます。

create function extract_number(in_number varchar2) return varchar2 is
begin
  return regexp_replace(in_number, '[^[:digit:]]', '');
end; 
34

文字列から数値を抽出するために正規表現を使用できます。確認しましょう。これがテキストと数字「mix12345overflow569」を混ぜた文字列であるとします。これは動作するはずです:

select regexp_replace('stack12345overflow569', '[[:alpha:]]|_') as numbers from dual;

「12345569」が返されます。

また、これを使用できます:

select regexp_replace('stack12345overflow569', '[^0-9]', '') as numbers,
       regexp_replace('Stack12345OverFlow569', '[^a-z and ^A-Z]', '') as characters
from dual

数値の場合は「12345569」、文字の場合は「StackOverFlow」を返します。

4
Parasram Pawar

文字列の小数点以下の桁数が正しいため、10進数の最初の数値を探している場合は、 regexp_substr このような機能:

regexp_substr('stack12.345overflow', '\.*[[:digit:]]+\.*[[:digit:]]*')
0
Iqbal Singh