Oracle sql正则表达式
对于表中的一列,我有一个类似“abc:efg:xyz”的字符串,该列的所有记录都是这样的。我希望此字符串的子字符串位于最后一个冒号之后:。请确实需要帮助 例如: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' -> 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>