web-dev-qa-db-ja.com

Oracle SQLを使用した区切り文字位置による文字列の分割

文字列があり、特定の位置で区切り文字でその文字列を分割したいと思います。

たとえば、私の文字列はF/P/Oであり、私が探している結果は次のとおりです。

Screenshot of desired result

したがって、文字列を最も遠い区切り文字で区切りたいと思います。
注:一部の文字列は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

結果は次のとおりです。

Screenshot of unexpected result

なぜこれが起こっているのですか、どうすれば修正できますか?

23
Avinesh Kumar

これには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です。

19
Gordon Linoff

したがって、文字列を最も遠い区切り文字で区切りたいと思います。

これは古い質問ですが、これは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の最初の区切り文字を意味します。

あなたのアプローチはうまくいきましたが、INSTRstart_positionがありませんでした。 start_positionがnegativeの場合、INSTR関数は、start_positionの文字数を文字列の末尾からカウントバックし、文字列の先頭に向かって検索します。

30
Lalit Kumar B