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
;

阅读有关字符串聚合技术的更多信息:关于聚合技术的 Tim Hall

阅读更多关于regexp_substrregexp_substr - Oracle 文档 - 10g

阅读更多关于regexp_substrregexp_substr - Oracle 文档 - 11g

于 2013-10-23T13:14:51.960 回答
2

您不必拆分然后聚合它。您可以使用 regexp_replace 仅将这些字符保留在方括号内,然后用逗号替换方括号。

WITH my_data
     AS (SELECT 'ABCD [1000-1987] BCD[101928-876] adgs[10987-786]' AS val
           FROM DUAL)
SELECT RTRIM (
          REPLACE (
              REGEXP_REPLACE (val, '(\[)(.*?\])|(.)', '\2'),
                  ']', ','),
          ',')
  FROM my_data;
于 2013-10-23T17:10:25.550 回答