regexp_substr 在正斜杠前恢复数据

regexp_substr to bring back data before a foward slash

我在数据集中有以下字符模式。我需要处理数据并将其交叉引用给另一个 table。我正在尝试编写一个 regexp_substr 以在从左侧开始的正斜线之前带回数据。例如:-

abc/ab/123/zzz

所以我需要得到以下结果,然后与另一个结果进行比较 table

abc
abc/ab
abc/ab/123

我已经制定了其他逻辑,但在各种正则表达式中苦苦挣扎。

您不需要正则表达式。您可以使用(更快的)字符串函数来完成:

SQL Fiddle

Oracle 11g R2 架构设置:

CREATE TABLE test_data ( id, value ) AS
  SELECT 1, 'abc/ab/123/zzz' FROM DUAL;

查询 1:

WITH bounds ( id, value, end_pos ) AS (
  SELECT id,
         value,
         INSTR( value, '/', 1 )
  FROM   test_data
  WHERE  INSTR( value, '/', 1 ) > 0
UNION ALL
  SELECT id,
         value,
         INSTR( value, '/', end_pos + 1 )
  FROM   bounds
  WHERE  INSTR( value, '/', end_pos + 1 ) > 0
)
SELECT id,
       SUBSTR( value, 1, end_pos ) AS item
FROM   bounds
ORDER BY id, end_pos

Results:

| ID |        ITEM |
|----|-------------|
|  1 |        abc/ |
|  1 |     abc/ab/ |
|  1 | abc/ab/123/ |

但是,如果您确实想使用正则表达式,那么您可以这样做:

查询 2:

WITH bounds ( id, value, lvl, item ) AS (
  SELECT id,
         value,
         1,
         REGEXP_SUBSTR( value, '.*?/', 1, 1 )
  FROM   test_data
  WHERE  REGEXP_SUBSTR( value, '.*?/', 1, 1 ) IS NOT NULL
UNION ALL
  SELECT id,
         value,
         lvl + 1,
         item || REGEXP_SUBSTR( value, '.*?/', 1, lvl + 1 )
  FROM   bounds
  WHERE  REGEXP_SUBSTR( value, '.*?/', 1, lvl + 1 ) IS NOT NULL
)
SELECT id,
       item
FROM   bounds

Results:

| ID |        ITEM |
|----|-------------|
|  1 |        abc/ |
|  1 |     abc/ab/ |
|  1 | abc/ab/123/ |

这是 SUBSTRINSTR 的递归查询:

with cte(col) as
(
  select substr(col, 1, instr(col, '/', -1) - 1) from mytable
  union all
  select substr(col, 1, instr(col, '/', -1) - 1) from cte where instr(col, '/') > 0
)
select col from cte;

这里是 REGEXP_REPLACE 的查询:

with cte(col) as
(
  select regexp_replace(col, '/[^/]*$', '') from mytable
  union all
  select regexp_replace(col, '/[^/]*$', '') from cte where instr(col, '/') > 0
)
select col from cte;