需要在oracle中查询下面的正则表达式[关闭]

Posted

技术标签:

【中文标题】需要在oracle中查询下面的正则表达式[关闭]【英文标题】:need query on below regexp in oracle [closed] 【发布时间】:2020-12-27 12:37:01 【问题描述】:
COLUMN_A
---------------------------

mysql/SQL
MYSQL/SQL/ORACLE
MYSQL/SQL/ORACLE/TOAD
MYSQL/SQL/ORACLE/TOAD/PLSQL
MYSQLSQLORACLE -PLSQL

我期待以下输出:

COLUMN_B                               COLUMN_C
----------------------                 ------------------- 
MYSQL                                   SQL
SQL                                     ORACLE
SQL                                     ORACLE/TOAD
SQL                                     ORACLE/TOAD/PL/SQL
MYSQLSQLORACLE -PLSQL                   NULL

逻辑:

    如果column_a 值包含一个斜线,则将斜线值之前放入coulmn_b,在salsh 之后将值放入column_c

    如果 column_a 值包含 2 个斜杠,则将更改第一个斜杠值放入 coulmn_b 并在第二个 salsh 后将值放入 column_c

【问题讨论】:

看起来像是某种层次结构数据,但是 - 未格式化,很难阅读和猜测什么是什么。请您解决这个问题并用简单的英语解释从输入到输出的规则吗? 1.如果 column_a 值包含一个斜线,则将斜线值之前放入 coulmn_b 并在 salsh 之后将值放入 column_c 2.如果 column_a 值包含 2个斜线,则将更改第一个斜线值放入 coulmn_b 并在第二个 salsh 后将值放入 column_c 【参考方案1】:

您似乎要根据单词ORACLE 提取column_B,并根据单词SQL 提取column_C。所以,考虑使用:

SELECT CASE WHEN REGEXP_SUBSTR(column_A,'[^/]+',1,3)='ORACLE' 
            THEN REGEXP_SUBSTR(column_A,'[^/]+',1,2)
            ELSE REGEXP_SUBSTR(column_A,'[^/]+')
             END AS column_B,
       CASE WHEN INSTR(column_A,'/') > 0 
            THEN REGEXP_REPLACE(column_A,'(.*SQL/)(\S+)(.*)','\2',1,1) 
             END AS column_C
  FROM tab;

  COLUMN_B              COLUMN_C
  --------------------- ---------------------
  MYSQL                 SQL
  SQL                   ORACLE
  SQL                   ORACLE/TOAD
  SQL                   ORACLE/TOAD/PLSQL
  MYSQLSQLORACLE -PLSQL 

Demo

更新:根据以后更新中的规则,可以使用

WITH t AS
(
 SELECT column_A,
        CASE WHEN REGEXP_COUNT(column_A,'/') = 0
             THEN column_A
             WHEN REGEXP_COUNT(column_A,'/') = 1
             THEN REGEXP_SUBSTR(column_A,'[^/]+')
             ELSE REGEXP_SUBSTR(column_A,'[^/]+',1,2)
              END AS column_B
   FROM tab   
)
SELECT  column_B,
        CASE WHEN REGEXP_COUNT(column_A,'/') = 1
             THEN REGEXP_SUBSTR(column_A,'[^/]+$')
             WHEN REGEXP_COUNT(column_A,'/') > 1
             THEN REGEXP_REPLACE(column_A,'(.*'||column_B||'/)(\S+)(.*)','\2',1,1) 
              END AS column_C
  FROM t;

  COLUMN_B              COLUMN_C
  --------------------- ---------------------
  MYSQL                 SQL
  SQL                   ORACLE
  SQL                   ORACLE/TOAD
  SQL                   ORACLE/TOAD/PLSQL
  MYSQLSQLORACLE -PLSQL 

Demo

【讨论】:

【参考方案2】:

您的逻辑似乎是:

SELECT column_A,
       (CASE WHEN column_A like '%/%/%'
             THEN REGEXP_SUBSTR(column_A, '[^/]+', 1, 2)
             ELSE REGEXP_SUBSTR(column_A, '[^/]+', 1, 1)
        END) AS column_B,
       (CASE WHEN column_A like '%/%/%'
             THEN REGEXP_REPLACE(column_A, '^[^/]+/[^/]+/(.*)$', '\1')
             ELSE REGEXP_SUBSTR(column_A, '[^/]+', 1, 2)
        END) AS column_C
FROM tab;

Here 是一个 dbfiddle。

【讨论】:

以上是关于需要在oracle中查询下面的正则表达式[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我需要使用正则表达式从以下阶段获取金额值[关闭]

oracle10g中,如何查询正则表达式匹配指定字符串的匹配个数?

Oracle10g新特性——正则表达式 - 转

如何使用正则表达式选择字母数字字符

Oracle:使用正则表达式从查询中排除结果

oracle10g中,如何查询正则表达式匹配指定字符串的匹配个数?