【问题标题】:need query on below regexp in oracle [closed]需要在oracle中查询下面的正则表达式[关闭]
【发布时间】: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

逻辑:

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

  2. 如果 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

标签: sql regex oracle oracle11g


【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-29
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      相关资源
      最近更新 更多