3

Oracle pl / sqlで次のコードを使用しています(バージョン:Oracle Database 11gリリース11.2.0.1.0)

select regexp_substr('A~B~C','[^~]+',1,level) output
from dual
connect by level <= length(regexp_replace('A~B~C','[^~]+')) + 1

これにより、次の結果が得られます

row1: A
row2: B
row3: C

これは完璧ですが、null値を指定する必要があります。つまり、次のようになります。

select regexp_substr('~B~C','[^~]+',1,level) output
from dual
connect by level <= length(regexp_replace('~B~C','[^~]+')) + 1

私は次のことを期待し、望んでいました。

row1: <null>
row2: B
row3: C

しかし、この出力を得ました:

row1: B
row2: C
row3: null

pl / sqlコードを間違って実行していますか?どうすれば正しく機能させることができますか?

4

5 に答える 5

4

INSTRundを組み合わせSUBSTRて、目的の結果を得ることができます。

select  
  str, 
  replace(substr(str, 
                 case level 
                 when 1 then 0 
                 else instr( str, '~',1, level-1) 
                 end 
                  +1,
                 1
                ), '~')
from ( select 'A~B~C~D~E' as str from dual)
connect by level <= length(regexp_replace(str,'[^~]+')) + 1
;
于 2013-02-12T11:46:31.870 に答える
2

条項NULLS FIRSTで使用できますORDER BY

select regexp_substr('~B~C','[^~]+',1,level) output
from dual
connect by level <= length(regexp_replace('~B~C','[^~]+')) + 1
ORDER BY regexp_substr('~B~C','[^~]+',1,level) NULLS FIRST;

Oracleのドキュメントから引用するには

nullの順序が指定されていない場合、null値の処理は次のようになります。

NULLS LAST if the sort is ASC

NULLS FIRST if the sort is DESC

昇順も降順も指定されておらず、NULLの順序も指定されていない場合は、両方のデフォルトが使用されるため、順序はNULLSLASTで昇順になります。

于 2013-02-12T10:22:00.473 に答える
2

質問では例として単一の文字を使用しましたが、実際には、プロジェクトで長い文字列を使用しています。たとえば、「How〜do〜I〜do〜this」

chris227のおかげで、OTNOracle.comからこのソリューションに出くわしました。

SELECT CAST(REGEXP_SUBSTR (str, '(.*?)(~|$)', 1, level, null, 1) AS CHAR(12))  output
FROM (select 'How~do~I~do~this' as str from dual)
CONNECT BY level <= regexp_count(str, '~') + 1;

これは、単一の文字でも機能します。

これが類似の解決策を探している他の人に役立つことを願っています。

于 2013-02-12T18:28:35.597 に答える
0

今は遅いことは知っていますが、あなた(そして私)が必要としていたのはこれだったと思います:

select REPLACE(regexp_substr('A~~C','[^~]*(~)?',1,level),'~') output, level
from dual
connect by level <= length(regexp_replace('A~~C','[^~]+')) + 1
ORDER BY level;
于 2015-07-23T18:00:04.233 に答える
0

この問題は頭の中で新鮮で、たまたまこの投稿を見たので、user3767503の回答に基づいた提案を丁重に提出します。必要な関数呼び出しの数を減らします。11gのアップデートをregexp_substr()使用しておりregexp_count()、11gでも導入されたと思います。フィールドの数は、区切り文字の数に1を加えた数であると想定しています。

select regexp_substr('AAA~X~C~~DD~~~E', '([^~]*)(~|$)', 1, level, null, 1) output, level
from dual
connect by level <= regexp_count('AAA~X~C~~DD~~~E','~') + 1 
ORDER BY level;

正規表現パターンの読み取りの詳細と詳細については、この投稿を参照してください:コンマで区切られた値を列に分割します

一番下の行は、リストにnullがある場合に文字列の解析に失敗する、一般的に使用される正規表現パターンであり'[^<delimiter>]+'、回避する必要があります、IMHO。

于 2015-07-23T19:32:11.747 に答える