0

レコードの一部の後にレコードの一部tableのみを取得する必要がある場所があります。 with comma

for example私は持っている

ABCD [1000-1987] BCD[101928-876] adgs[10987-786]

私は好きなものを手に入れたいrecord

1000-1987,101928-876,10987-786

前述のように記録を取得するのを手伝っていただけませんか。

4

2 に答える 2

4

11g を使用せず、使用したくない場合wm_concat:

WITH
  my_data AS (
    SELECT 'ABCD [1000-1987] BCD[101928-876] adgs[10987-786]' AS val FROM dual
)
SELECT
    ltrim(
      MAX(
        sys_connect_by_path(
          rtrim(ltrim(regexp_substr(val, '\[[0-9-]*\]', 1, level, NULL), '['), ']'),
          ',')
      ),
    ',') AS val_part
  FROM my_data
CONNECT BY regexp_substr(val, '\[[0-9-]*\]', 1, level, NULL) IS NOT NULL
;

使用してwm_concatも問題ない場合:

WITH
  my_data AS (
    SELECT 'ABCD [1000-1987] BCD[101928-876] adgs[10987-786]' AS val FROM dual
)
SELECT
    wm_concat(rtrim(ltrim(regexp_substr(val, '\[[0-9-]*\]', 1, level, NULL), '['), ']')) AS val_part
  FROM my_data
CONNECT BY regexp_substr(val, '\[[0-9-]*\]', 1, level, NULL) IS NOT NULL
;

11g を使用する場合:

WITH
  my_data AS (
    SELECT 'ABCD [1000-1987] BCD[101928-876] adgs[10987-786]' AS val FROM dual
)
SELECT
    listagg(regexp_substr(val, '[a-b ]*\[([0-9-]*)\] ?', 1, level, 'i', 1), ',') WITHIN GROUP (ORDER BY 1) AS val_part
  FROM my_data
CONNECT BY regexp_substr(val, '[a-b ]*\[([0-9-]*)\] ?', 1, level, 'i', 1) IS NOT NULL
;

文字列集約手法の詳細を読む: 集約手法についてのティム・ホール

詳細については、次を参照してくださいregexp_substr: regexp_substr - Oracle Documentation - 10g

詳細については、次を参照してくださいregexp_substr: regexp_substr - Oracle Documentation - 11g

于 2013-10-23T13:14:51.960 に答える