Oracle sql正则表达式

Oracle sql正则表达式,sql,regex,oracle,Sql,Regex,Oracle,对于表中的一列,我有一个类似“abc:efg:xyz”的字符串,该列的所有记录都是这样的。我希望此字符串的子字符串位于最后一个冒号之后:。请确实需要帮助 例如: 'abc : efg : xyz' -> xyz </br> 'abc : efg : efghj'-> efghj 正如您所说,模式是固定的,反转字符串并查找和获取子字符串直到第一个分号将是最简单的。也可以使用“修剪”来消除任何前导/尾随空格 select reverse(substr(reverse(

对于表中的一列,我有一个类似“abc:efg:xyz”的字符串,该列的所有记录都是这样的。我希望此字符串的子字符串位于最后一个冒号之后:。请确实需要帮助

例如:

'abc : efg : xyz'  -> xyz  </br>

'abc : efg : efghj'-> efghj

正如您所说,模式是固定的,反转字符串并查找和获取子字符串直到第一个分号将是最简单的。也可以使用“修剪”来消除任何前导/尾随空格

select reverse(substr(reverse('abc : efg : efghj'),
          1,instr(reverse('abc : efg : efghj'),':')-1)) from dual

如果函数的position参数为负数,它将从字符串末尾开始倒数。所以你可以用这样的东西:

SELECT TRIM(SUBSTR('abc : efg : efghj',INSTR('abc : efg : efghj',':',-1) + 1))
FROM   dual;
你想要的是:

REGEXP_REPLACE (INPUTSTR, '^([^:]+ : )*', '')
具体地说,这将查找一个从起始插入符号^开始的字符串,其中零个或多个非冒号[^::]后跟:。它将所有以冒号空格结尾的前导字符串替换为空字符串

下面的查询演示了这是如何工作的。我在示例输入和六个其他测试中使用了一个分解子查询,查询输出包含输入、我的regexp_replace result和你的replace regexp_SUBSTR语法。我用分解子查询替换了你的“abc:efg:xyz”。您可以通过复制union all select行并更改inputstr的字符串来添加另一个测试用例

哦,关于doold-如果没有冒号,您的语法无法处理输入字符串,它将抛出一个错误,导致所有查询结果无效。所以我把你的语法包装在一个DECODE doold中,把所有的行都取回来

with sampl as (
  select           'abc : efg : xyz' as inputstr, 1 as doold from dual
  union all select 'z : b :' as inputstr, 1 as doold  from dual
  union all select 'z : b : ' as inputstr, 1 as doold  from dual
  union all select ' : a ' as inputstr, 1 as doold  from dual
  union all select ' a ' as inputstr, 0 as doold  from dual
  union all select '' as inputstr, 1 as doold  from dual
  union all select ' hij : klm : nop : qrs : tuv' as inputstr, 1 as doold  from dual
)
SELECT 
  inputstr,
  regexp_replace (inputstr, '^([^:]+ : )*', '') as bettr,
  decode (doold, 
      1, -- the following is your original expression, for comparison 
         -- purposes, edited only to replace 'abc : efg : xyz' with inputstr
         REPLACE (
          REGEXP_SUBSTR (
             inputstr,
             ':.*$',
             REGEXP_INSTR (
                inputstr,
                ':',
                1,
                  LENGTH (inputstr)
                - LENGTH (
                     REPLACE (inputstr,
                              ':',
                              NULL))),
             1),
          ': '),
          'Sorry the syntax won''t support input "' || inputstr || '"'
    ) data_after_the_last_colon
  FROM sampl
 order by doold desc, length (inputstr)

给你。这也适用于空列表元素:

SQL> with tbl(row_nbr, str) as (
  2  select 1, 'abc : efg : xyz' from dual
  3  union
  4  select 2, 'abc : efg : efghj' from dual
  5  union
  6  select 3, 'abc :  : efghj' from dual
  7  )
  8  select row_nbr, regexp_substr(str, '(.*?)( : |$)', 1, regexp_count(str, ' \: ')+1, null, 1)
  9  from tbl
 10  order by row_nbr;

   ROW_NBR REGEXP_SUBSTR(STR
---------- -----------------
         1 xyz
         2 efghj
         3 efghj

SQL>
如果要分析整个列表,请执行以下操作:

SQL> with tbl(row_nbr, str) as (
  2  select 1, 'abc : efg : xyz' from dual
  3  union
  4  select 2, 'abc : efg : efghj' from dual
  5  union
  6  select 3, 'abc :  : efghj' from dual
  7      )
  8  SELECT row_nbr, str,
  9             COLUMN_VALUE AS match_nbr,
 10            REGEXP_SUBSTR( str ,'(.*?)( : |$)', 1, COLUMN_VALUE, NULL, 1 ) AS match_value
 11     FROM   tbl,
 12            TABLE(
 13              CAST(
 14                MULTISET(
 15                  SELECT LEVEL
 16                  FROM   DUAL
 17                  CONNECT BY LEVEL <= REGEXP_COUNT( str ,' : ' )+1
 18                ) AS SYS.ODCINUMBERLIST
 19              )
 20            );

   ROW_NBR STR                MATCH_NBR MATCH_VALUE
---------- ----------------- ---------- -----------------
         1 abc : efg : xyz            1 abc
         1 abc : efg : xyz            2 efg
         1 abc : efg : xyz            3 xyz
         2 abc : efg : efghj          1 abc
         2 abc : efg : efghj          2 efg
         2 abc : efg : efghj          3 efghj
         3 abc :  : efghj             1 abc
         3 abc :  : efghj             2
         3 abc :  : efghj             3 efghj

9 rows selected.

SQL>

不幸的是,Oracle中没有记录反向操作。@JonHeller..请检查一下..该文档是用于MySQL的。我建议您自己尝试一下。目前,它在我的系统上可以正常工作。但它可能无法在其他系统上运行,或者在将来无法运行。Oracle已表示愿意删除未记录的功能,无论其受欢迎程度如何。例如,WM_CONCAT是一个未记录但很流行的函数,在12c中被删除。如果函数未列出,则使用起来可能不安全。
SQL> with tbl(row_nbr, str) as (
  2  select 1, 'abc : efg : xyz' from dual
  3  union
  4  select 2, 'abc : efg : efghj' from dual
  5  union
  6  select 3, 'abc :  : efghj' from dual
  7      )
  8  SELECT row_nbr, str,
  9             COLUMN_VALUE AS match_nbr,
 10            REGEXP_SUBSTR( str ,'(.*?)( : |$)', 1, COLUMN_VALUE, NULL, 1 ) AS match_value
 11     FROM   tbl,
 12            TABLE(
 13              CAST(
 14                MULTISET(
 15                  SELECT LEVEL
 16                  FROM   DUAL
 17                  CONNECT BY LEVEL <= REGEXP_COUNT( str ,' : ' )+1
 18                ) AS SYS.ODCINUMBERLIST
 19              )
 20            );

   ROW_NBR STR                MATCH_NBR MATCH_VALUE
---------- ----------------- ---------- -----------------
         1 abc : efg : xyz            1 abc
         1 abc : efg : xyz            2 efg
         1 abc : efg : xyz            3 xyz
         2 abc : efg : efghj          1 abc
         2 abc : efg : efghj          2 efg
         2 abc : efg : efghj          3 efghj
         3 abc :  : efghj             1 abc
         3 abc :  : efghj             2
         3 abc :  : efghj             3 efghj

9 rows selected.

SQL>