2

p_valueを使用して文字列を分割していp_delimeterます[^,]+.

ほとんどの場合、次のクエリは予想どおりに機能しますが、次のような場合にはうんざりします。

  1. 文字列p_valueには改行が含まれていますchr(10)
  2. p_value p_delimeter部分文字列として含まれていない、

そのため、結果として全体が1行になると予想されますがp_value、改行後の残りは得られません。

'm'ここでは、 への呼び出しに修飾子がないため、regexp は改行を通常の記号として扱うと想定されていますregexp_substr

この動作が正しいことと、期待される結果を得る方法を説明してください。


WITH 
  params AS (SELECT 'ab' || chr(10) || 'cd' p_value,
                    'xxx' p_delimeter
               FROM dual
  )          
SELECT regexp_substr(p_value, '(.*?)(' || p_delimeter || '|$)', 1, level, 'c', 1) AS CUT
  FROM params
CONNECT BY regexp_substr(p_value, '(.*?)(' || p_delimeter || '|$)', 1, level, 'c', 1) IS NOT NULL;


Actual result:      Expected result:
-----               ------
 CUT                 CUT
-----               ------ 
 cd                  ab/cd 
                       ^
                       'this is just a marker for a line break [= chr(10)]'
4

1 に答える 1