【问题标题】:Extract certain pattern with Oracle SQL使用 Oracle SQL 提取特定模式
【发布时间】:2013-08-02 20:59:35
【问题描述】:

我有一个类似

的字符串
with xx as (
select 'id9' idno,'untest X456789,W357987 and Q321089 cont group' test from dual)
select * from xx

有一些像下面这样的行

       IDNO |                             TEST
      +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        id9 | untest X456789,W357987 and Q321089 cont group

我想提取以字母开头后跟 6 位数字的单词。另外,它们之间应该有一个逗号(因为稍后我会将它们放在多行中)

结果表:

        IDNO |                TEST
      +++++++++++++++++++++++++++++++++++++++++
        id9 | X456789,X321678,W357987,Q321089

我尝试了regexp_replace,但无法找到解决方案。

select idno, REGEXP_replace( test,'([^[A-Z]{1}[:digit:]{6},?])') AS test from xx

【问题讨论】:

  • 你确定你的数据库已经规范化了吗?
  • 这是一个有意去规范化的OLAP环境。 (更少的连接,更简洁的代码)。上表是从第三方机构收到的,遗憾的是我们没有机会根据需要对其进行格式化。
  • 这是可以的,只要它是有目的的而不是因为对规范化的理解不足。祝你好运! :)

标签: sql regex oracle11gr2


【解决方案1】:

以下内容可以满足您对原始字符串的要求:

with xx as (
select 'id9' idno,'untest X456789,W357987 and Q321089 cont group' test from dual
)
select idno,
       REGEXP_replace(test,
                      '([A-Z]{1}[0-9]{6}[ ,]?)|(.)', '\1'
                     ) AS test
from xx;

让第二个空格成为逗号。 . .您可以使用常规替换:

with xx as (
select 'id9' idno,'untest X456789,W357987 and Q321089 cont group' test from dual
)
select idno,
       replace(REGEXP_replace(test,
                              '([A-Z]{1}[0-9]{6}[ ,]?)|(.)', '\1'
                             ),
               ' ', ',') AS test
from xx;

SQL Fiddle 是 here

【讨论】:

  • 先生。 Linoff,第一次查询没有对原始字符串进行更改。第二个只是在所有单词之间放置了逗号。
  • @bonsvr 。 . .我为此道歉。我让它在 SQL Fiddle 中工作,显然将错误的查询复制回答案。固定。
  • 非常感谢。顺便说一句,从你的书中学到了很多东西。
猜你喜欢
  • 1970-01-01
  • 2022-10-15
  • 2019-05-07
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 2021-11-04
相关资源
最近更新 更多