需要在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中查询下面的正则表达式[关闭]的主要内容,如果未能解决你的问题,请参考以下文章