パラメーターとして文字列を受け取る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データベースにそのような関数を追加するにはどうすればよいですか?
文字列からすべての非数字文字を削除するには、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;
文字列から数値を抽出するために正規表現を使用できます。確認しましょう。これがテキストと数字「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」を返します。
文字列の小数点以下の桁数が正しいため、10進数の最初の数値を探している場合は、 regexp_substr
このような機能:
regexp_substr('stack12.345overflow', '\.*[[:digit:]]+\.*[[:digit:]]*')