文字列があり、特定の位置で区切り文字でその文字列を分割したいと思います。
たとえば、私の文字列はF/P/O
であり、私が探している結果は次のとおりです。
したがって、文字列を最も遠い区切り文字で区切りたいと思います。
注:一部の文字列はF/O
であり、これに対して以下のSQLが正常に機能し、目的の結果を返します。
私が書いたSQLは次のとおりです。
SELECT Substr('F/P/O', 1, Instr('F/P/O', '/') - 1) part1,
Substr('F/P/O', Instr('F/P/O', '/') + 1) part2
FROM dual
結果は次のとおりです。
なぜこれが起こっているのですか、どうすれば修正できますか?
これにはregexp_substr()
を使用します。これはあなたの例のために働くはずです:
select regexp_substr(val, '[^/]+/[^/]+', 1, 1) as part1,
regexp_substr(val, '[^/]+$', 1, 1) as part2
from (select 'F/P/O' as val from dual) t
ここ は、ちなみにSQL Fiddleです。
おっと。質問のlast区切り記号の部分を見逃しました。そのために、最初の部分にregex_replace()
を使用できます。
select regexp_replace(val, '/[^/]+$', '', 1, 1) as part1,
regexp_substr(val, '[^/]+$', 1, 1) as part2
from (select 'F/P/O' as val from dual) t
そして here は、この対応するSQL Fiddleです。
したがって、文字列を最も遠い区切り文字で区切りたいと思います。
これは古い質問ですが、これはSUBSTRおよびINSTRで十分な単純な要件です。 REGEXPはまだslowerおよびCPUに負荷がかかるの操作が古いsubtsrおよびinstr関数よりも大きい。
SQL> WITH DATA AS
2 ( SELECT 'F/P/O' str FROM dual
3 )
4 SELECT SUBSTR(str, 1, Instr(str, '/', -1, 1) -1) part1,
5 SUBSTR(str, Instr(str, '/', -1, 1) +1) part2
6 FROM DATA
7 /
PART1 PART2
----- -----
F/P O
最も遠い区切り文字が必要だと言ったように、それはreverseの最初の区切り文字を意味します。
あなたのアプローチはうまくいきましたが、INSTRのstart_positionがありませんでした。 start_positionがnegativeの場合、INSTR
関数は、start_positionの文字数を文字列の末尾からカウントバックし、文字列の先頭に向かって検索します。